วิธีต่อท้ายวัตถุ list‹T› เข้ากับวัตถุอื่น

ใน C++ ฉันมี list<T> วัตถุ A และ B สองอัน และฉันต้องการเพิ่มสมาชิกทั้งหมดของ B ต่อท้าย A ฉันได้ค้นหาแหล่งข้อมูลที่แตกต่างกันสองสามแห่งและไม่พบวิธีแก้ปัญหาง่ายๆ (เช่น A.append(B);) และสิ่งนี้ทำให้ฉันประหลาดใจเล็กน้อย

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร

เมื่อมันเกิดขึ้น ฉันไม่สนใจ B หลังจากนี้ (มันจะถูกลบในบรรทัดถัดไป) ดังนั้นหากมีวิธีที่จะใช้ประโยชน์จากสิ่งนั้นเพื่อประสิทธิภาพที่ดีขึ้น ฉันก็สนใจเช่นกัน


person BCS    schedule 19.09.2009    source แหล่งที่มา


คำตอบ (2)


หากคุณต้องการผนวก สำเนาของรายการ ใน B คุณสามารถทำได้:

a.insert(a.end(), b.begin(), b.end());

หากคุณต้องการ ย้ายรายการ ของ B ไปที่จุดสิ้นสุดของ A (ล้าง B พร้อมกัน) คุณสามารถทำได้:

a.splice(a.end(), b);

ในสถานการณ์ของคุณ การประกบจะดีกว่า เนื่องจากเป็นเพียงการปรับพอยน์เตอร์สองสามตัวในรายการที่เชื่อมโยง

person UncleBens    schedule 19.09.2009
comment
+1. ถูกต้องแล้ว ถ้ามันง่ายและมีประสิทธิภาพมากในการแบ่งส่วนแผนที่และตั้งค่า... - person paercebal; 20.09.2009
comment
การดำเนินการอย่างใดอย่างหนึ่งเหล่านี้ O(1) หรือไม่? - person Chris Redford; 13.03.2013
comment
ฉันเดาว่าการประกบกันควรเป็น O(1) สำหรับกรณีข้างต้น - person chunkyguy; 27.03.2013
comment
คือ O(1) สำหรับ a.splice(a.end(), b) และ a.splice(a.end(), b, it_b_start) แต่เป็น O(n) สำหรับ a.splice(a.end(), b, it_b_start, it_b_end) - person hkBattousai; 08.08.2013
comment
วิธีนี้เป็นแบบอะตอมมิกหรือไม่? ฉันสามารถใช้มันในสภาพแวดล้อมแบบขนานได้หรือไม่? - person orezvani; 27.03.2014
comment
@hkBattousai ส่วนที่น่าสนใจเกี่ยวกับตัวกำหนดเวลากระบวนการ แต่ฉันสามารถใช้ข้อมูลเพิ่มเติมเกี่ยวกับส่วนเฉพาะนั้นได้ บางทีคุณอาจให้ลิงก์พร้อมรายละเอียดเพิ่มเติมว่าทำไมมันถึงเป็น O(1) และ O(n) ? - person serup; 12.12.2016
comment
เพราะเหตุใด STL จึงไม่สามารถสนับสนุน a.append(b) ได้ - person srking; 08.12.2017

ตัวอย่างหนึ่งการใช้บูสต์

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
person serup    schedule 12.12.2016