wadah antrian c++

Saya mempunyai masalah dengan antrian di program saya. Memiliki satu antrian saya ingin menggunakan antrian ini, hanya dengan id lain. Inilah yang saya miliki sekarang:

queue<R> queue;
queue<R> queue2;
...
while (! queue2.empty() )
{
  R r = queue2.front();
  queue2.pop();
  queue.push(r);
}

Tapi itu linier. Saya berharap dapat melakukannya dalam waktu O(1). Saya mencoba menggunakan referensi tetapi gagal.


person JosephConrad    schedule 15.01.2012    source sumber
comment
Apa yang Anda maksud dalam waktu O(1)? Untuk menempatkan semua elemen dari q2 ke q1? Atau sesuatu yang lain?   -  person BЈовић    schedule 16.01.2012
comment
Coba apa yang gagal?   -  person Oliver Charlesworth    schedule 16.01.2012
comment
Kenapa malah mengganti nama sama sekali?   -  person GManNickG    schedule 16.01.2012
comment
stackoverflow.com/questions/937621/ - kalau tidak, saya akan mengatakan queue.swap(queue2);   -  person John Zwinck    schedule 16.01.2012
comment
Saya mencoba cara ini: queue = queue2 dan queue = &queue2. Tapi itu tidak bagus. Saya ingin menghindari penyalinan semua elemen, karena memerlukan waktu lama dalam program saya   -  person JosephConrad    schedule 16.01.2012
comment
Bisakah Anda menggunakan C++11 atau tidak? Pertimbangkan untuk menggunakan std::list, yang memungkinkan Anda melakukan list1.swap(list2)--Anda masih dapat menggunakannya seperti antrian.   -  person John Zwinck    schedule 16.01.2012
comment
@JohnZwinck: Tidak mungkin mengganti wadah begitu saja adalah hal yang benar untuk dilakukan.   -  person Lightness Races in Orbit    schedule 16.01.2012
comment
@JohnZwinck: Dan meskipun demikian, std::list adalah wadah terburuk. Gunakan std::deque di sini.   -  person GManNickG    schedule 16.01.2012


Jawaban (2)


Anda tidak memberi tahu kami bagaimana Anda "gagal", namun referensinya sangat mudah:

std::queue<R> queue;
std::queue<R>& queue2 = queue;

Pekerjaan selesai.

person Lightness Races in Orbit    schedule 15.01.2012

Anda dapat menggunakan fungsi std::swap gratis:

std::queue<R> queue2;
std::swap(queue1, queue2);

Ini hanya memanggil swap pada container yang mendasarinya, jadi ini seharusnya cukup efisien.

(Menurut pertanyaan terkait John Zwinck, ini adalah fitur baru C++11, jadi kompiler lama mungkin menolak ini atau menerapkan implementasi yang tidak efisien.)

person Kerrek SB    schedule 15.01.2012