คอนเทนเนอร์คิว c++

ฉันมีปัญหากับคิวในโปรแกรมของฉัน การมีคิวหนึ่งฉันต้องการใช้คิวนี้กับอีก id เท่านั้น นี่คือสิ่งที่ฉันมีตอนนี้:

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

แต่มันเป็นเส้นตรง ฉันหวังว่าจะสามารถทำได้ในเวลา O(1) ฉันพยายามใช้ข้อมูลอ้างอิงแต่ไม่สำเร็จ


person JosephConrad    schedule 15.01.2012    source แหล่งที่มา
comment
คุณหมายถึงอะไรในเวลา O (1)? หากต้องการใส่องค์ประกอบทั้งหมดตั้งแต่ q2 ถึง q1? หรืออย่างอื่น?   -  person BЈовић    schedule 16.01.2012
comment
คุณพยายามทำอะไรที่ล้มเหลว?   -  person Oliver Charlesworth    schedule 16.01.2012
comment
ทำไมต้องเปลี่ยนชื่อเลยด้วยซ้ำ?   -  person GManNickG    schedule 16.01.2012
comment
stackoverflow.com/questions/937621/ - ไม่เช่นนั้นฉันจะบอกว่า Queue.swap(queue2);   -  person John Zwinck    schedule 16.01.2012
comment
ฉันลองวิธีนี้: queue = queue2 และ queue = &queue2 แต่มันก็ไม่ดี ฉันต้องการหลีกเลี่ยงการคัดลอกองค์ประกอบทั้งหมด เนื่องจากโปรแกรมของฉันใช้เวลานาน   -  person JosephConrad    schedule 16.01.2012
comment
คุณสามารถใช้ C++11 ได้หรือไม่? พิจารณาเพียงใช้ std::list ซึ่งจะช่วยให้คุณทำ list1.swap(list2)--คุณยังคงสามารถใช้งานได้เหมือนคิว   -  person John Zwinck    schedule 16.01.2012
comment
@JohnZwinck: ไม่น่าเป็นไปได้ที่การเปลี่ยนภาชนะนอกข้อมือเป็นสิ่งที่ถูกต้อง   -  person Lightness Races in Orbit    schedule 16.01.2012
comment
@JohnZwinck: และแม้ว่าจะเป็นเช่นนั้น std::list ก็เป็นคอนเทนเนอร์ที่แย่ที่สุด ใช้ std::deque ที่นี่   -  person GManNickG    schedule 16.01.2012


คำตอบ (2)


คุณไม่ได้บอกเราว่าคุณ "ล้มเหลว" ได้อย่างไร แต่การอ้างอิง ง่ายมาก:

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

งานเสร็จแล้ว.

person Lightness Races in Orbit    schedule 15.01.2012

คุณสามารถใช้ฟังก์ชัน std::swap ฟรี:

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

นี่เป็นเพียงการเรียก swap บนคอนเทนเนอร์ที่ซ่อนอยู่ ดังนั้นจึงควรมีประสิทธิภาพพอสมควร

(ตามคำถามที่เชื่อมโยงของ John Zwinck นี่เป็นคุณสมบัติใหม่ของ C ++ 11 ดังนั้นคอมไพเลอร์รุ่นเก่าอาจปฏิเสธสิ่งนี้หรือมีการใช้งานที่ไม่มีประสิทธิภาพ)

person Kerrek SB    schedule 15.01.2012