std :: set object เก็บในหน่วยความจำอย่างต่อเนื่องหรือไม่?


16

ไม่std::setวัตถุที่เก็บไว้ในหน่วยความจำที่ต่อเนื่องกันเช่นstd::vector?

ฉันไม่สามารถค้นหาสิ่งนี้บนเว็บได้ cppreference ไม่ได้กล่าวถึงรายละเอียดเกี่ยวกับการจัดสรรหน่วยความจำ แต่ฉันไม่เห็นว่าทำไมมันไม่สามารถใช้หน่วยความจำต่อเนื่องดังนั้นคำถามของฉัน


5
อ่านset::insertข้อกำหนด: en.cppreference.com/w/cpp/container/set/insert "... ไม่มีตัววนซ้ำหรือการอ้างอิงไม่ถูกต้อง .... "ดังนั้นจึงไม่สามารถจัดสรรซ้ำได้เมื่อต้องการขยายเช่นเดียวกับที่std::vectorทำ
Richard Critten

ประสิทธิภาพการทำงาน: คุณต้องวัด (ขึ้นอยู่กับฟังก์ชั่นการแฮชของคุณ) สำหรับกรณีการใช้งานของคุณดู: channel9.msdn.com/Events/Build/2014/2-661จาก45:48
Richard Critten

4
ดูยังเพิ่ม :: flat_set
Caleth

1
คุณหมายถึง 'ติด' ใน "ตามที่กำหนดซ้ำวัตถุจะถูกจัดเก็บในตำแหน่งหน่วยความจำต่อเนื่อง" หรือใน "วัตถุทั้งหมดจะถูกเก็บไว้ในหน่วยความจำขนาดใหญ่ก้อนเดียว
Pablo H

1
โดยทั่วไปเมื่อคุณพบว่าตัวเองถามว่า "คือคอนเทนเนอร์ A เหมือนกับคอนเทนเนอร์ B" คำตอบคือ "ไม่" มิฉะนั้นจะมีคอนเทนเนอร์ A เท่านั้น (เพราะวัตถุประสงค์ในการมีคอนเทนเนอร์ B คืออะไร) สิ่งนี้ใช้ไม่ได้กับอะแดปเตอร์ตู้คอนเทนเนอร์แน่นอน แต่std::setไม่ใช่สิ่งเหล่านี้ซึ่งเป็นกุญแจสำคัญที่นี่
การแข่งขัน Lightness ใน Orbit

คำตอบ:


25

std :: ชุดเก็บวัตถุในหน่วยความจำต่อเนื่องเช่น std :: vector หรือไม่?

ไม่มีการรับประกันว่าจะเป็น ในทางปฏิบัติมันไม่สามารถทำได้เนื่องจากข้อกำหนดของภาชนะบรรจุ ดังนั้นไม่มันจะไม่เก็บวัตถุในหน่วยความจำต่อเนื่อง

ฉันไม่เห็นสาเหตุที่ใช้หน่วยความจำต่อเนื่องไม่ได้

การอ้างอิงถึงองค์ประกอบของชุดจะต้องยังคงมีผลบังคับใช้ต่อเมื่อมีการแทรกเข้าไปเช่นเดียวกับการลบออก (ยกเว้นการอ้างอิงถึงองค์ประกอบที่ถูกลบ) ข้อกำหนดนี้ไม่สามารถใช้ร่วมกับหน่วยความจำต่อเนื่อง

เท่าที่ฉันทราบโครงสร้างการค้นหาที่สมดุลเป็นโครงสร้างข้อมูลเดียวที่สามารถใช้งานstd::setได้


มันสามารถแกะสลักพื้นที่สำหรับโหนดต้นไม้จากชิ้นส่วนขนาดใหญ่ที่ต่อเนื่องกันได้ในกรณีที่ OP หมายถึงอะไร (แต่ไม่มีกฎการinsertทำซ้ำ iterator คัดลอกโหนดทั้งหมดลงในบล็อกขนาดใหญ่ใหม่เพื่อ จำกัด เพียงหนึ่งบล็อกในกรณีที่ realloc ในสถานที่ล้มเหลวหรือ (ปกติสำหรับ C ++) ตัวจัดสรรไม่รองรับ realloc ดังกล่าว)
Peter Cordes

15

มันไม่ได้แยกออกอย่างชัดเจนแม้ว่าข้อ จำกัด บางประการที่std::setทำให้ไม่สามารถใช้หน่วยความจำต่อเนื่อง

ตัวอย่างเช่นset::insertมีความซับซ้อนแบบลอการิทึมขณะที่vector::insertต้องการความซับซ้อนเชิงเส้นเพื่อสลับรายการ นอกจากนี้set::insertจะไม่ทำให้ตัววนซ้ำใช้ไม่ได้ ข้อกำหนดทั้งสองนี้ไม่สามารถรับรู้ได้ด้วยหน่วยความจำที่ต่อเนื่อง

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