Apakah std::set
menyimpan 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.
set::insert
persyaratan: en.cppreference.com/w/cpp/container/set/insert "... Tidak ada iterator atau referensi yang tidak valid ...." sehingga tidak dapat realokasi ketika perlu diperluas seperti yangstd::vector
dilakukan.std::set
bukan salah satu dari hal-hal itu, yang merupakan kuncinya di sini.Jawaban:
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.
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
.sumber
insert
menyalin 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.)Itu tidak dikecualikan secara eksplisit, meskipun kendala tertentu untuk
std::set
membuatnya tidak mungkin untuk menggunakan memori yang berdekatan.Misalnya,
set::insert
memiliki kompleksitas logaritmik sementaravector::insert
memerlukan kompleksitas linier untuk mengacak entri-entri. Jugaset::insert
tidak membatalkan iterator. Kedua persyaratan tidak dapat diwujudkan dengan memori yang berbeda.sumber