Apakah std :: mengatur objek toko berdekatan di memori?

16

Apakah std::setmenyimpan objek dalam memori yang berdekatan suka std::vector?

Saya belum dapat menemukan ini di web, cppreference tidak menyebutkan rincian alokasi memori. Tapi saya tidak bisa melihat mengapa itu tidak bisa menggunakan memori yang berdekatan, maka pertanyaan saya.

mfnx
sumber
5
Baca set::insertpersyaratan: en.cppreference.com/w/cpp/container/set/insert "... Tidak ada iterator atau referensi yang tidak valid ...." sehingga tidak dapat realokasi ketika perlu diperluas seperti yang std::vectordilakukan.
Richard Critten
Kinerja: Anda perlu mengukur (tergantung pada fungsi hashing Anda) untuk kasus penggunaan Anda, lihat: channel9.msdn.com/Events/Build/2014/2-661 dari 45:48
Richard Critten
4
Lihat juga boost :: flat_set .
Caleth
1
Apakah yang Anda maksud 'berdampingan' seperti pada "ketika set iterated, objek disimpan di lokasi memori yang berdekatan", atau seperti dalam "semua objek disimpan dalam satu potongan besar memori (tetapi dalam urutan acak)"?
Pablo H
1
Secara umum, ketika Anda mendapati diri Anda bertanya "adalah wadah A sama dengan wadah B", jawabannya adalah "tidak", jika tidak hanya akan ada wadah A (karena apa tujuan dari memiliki wadah B?). Ini tentu saja tidak berlaku untuk adaptor wadah , tetapi std::setbukan salah satu dari hal-hal itu, yang merupakan kuncinya di sini.
Lightness Races di Orbit

Jawaban:

25

Apakah std :: mengatur objek toko dalam memori yang berdekatan seperti std :: vector?

Tidak ada jaminan hal itu terjadi. Juga dalam praktiknya, itu tidak bisa karena persyaratan wadah. Karenanya tidak, itu tidak menyimpan objek dalam memori yang berdekatan.

Saya tidak bisa melihat mengapa itu tidak bisa menggunakan memori yang berdekatan

Referensi elemen-elemen set harus tetap valid saat penyisipan serta penghapusan (kecuali untuk referensi ke elemen yang dihapus). Persyaratan ini tidak kompatibel dengan memori yang berdekatan.

Sejauh yang saya tahu, pohon pencarian seimbang adalah satu-satunya struktur data yang dapat diimplementasikan std::set.

eerorika
sumber
Itu bisa mengukir ruang untuk simpul pohon dari potongan besar yang berdekatan, jika itu yang dimaksud OP. (Tetapi tidak ada pembatalan iterator yang tidak insertmenyalin semua node ke blok baru yang lebih besar untuk membatasi hanya satu blok, jika realloc di tempat gagal atau (tipikal untuk C ++), pengalokasi tidak mendukung realokasi tersebut.)
Peter Cordes
15

Itu tidak dikecualikan secara eksplisit, meskipun kendala tertentu untuk std::setmembuatnya tidak mungkin untuk menggunakan memori yang berdekatan.

Misalnya, set::insertmemiliki kompleksitas logaritmik sementara vector::insertmemerlukan kompleksitas linier untuk mengacak entri-entri. Juga set::inserttidak membatalkan iterator. Kedua persyaratan tidak dapat diwujudkan dengan memori yang berbeda.

idclev 463035818
sumber