วิธีการต่อท้ายรายการ <T> วัตถุกับวัตถุอื่น


94

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

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

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

คำตอบ:


195

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

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

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

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

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


8
+1. ถูกต้อง หากสามารถ "แบ่ง" แผนที่และชุดต่างๆได้ง่ายและมีประสิทธิภาพ ...
paercebal

การดำเนินการอย่างใดอย่างหนึ่งเหล่านี้เป็น O (1) หรือไม่?
Chris Redford

2
ฉันเดาว่ารอยต่อควรเป็น O (1) สำหรับกรณีด้านบน
chunkyguy

9
มันเป็น 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)สำหรับ
hkBattousai

10
ทำไมทำไม STL ถึงไม่สนับสนุน a.append (b)?
srking

-3

ตัวอย่างหนึ่งโดยใช้การเพิ่ม

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 ); }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.