Std :: set nesneleri nesne içinde sürekli olarak saklıyor mu?


16

Does std::setgibi bitişik bellekte saklamak nesneleri std::vector?

Bunu web'de bulamadım, cppreference bellek ayırma ile ilgili ayrıntılardan bahsetmiyor. Ama neden bitişik belleği kullanamadığını göremiyorum, dolayısıyla sorum.


5
set::insertGereksinimleri okuyun : en.cppreference.com/w/cpp/container/set/insert "... Hiçbir yineleyici veya referans geçersiz kılınmaz ...", bu nedenle bir genişleme gerektiğinde yeniden tahsis edemez std::vector.
Richard Critten

Performans: Kullanımınızın durum bakın (senin karma fonksiyonu bağlıdır) ölçmek gerekir channel9.msdn.com/Events/Build/2014/2-661 dan 45:48
Richard Critten

4
Ayrıca bkz . Boost :: flat_set .
Caleth

1
"Küme yinelendiğinde, nesneler bitişik bellek konumlarında saklanır" veya "tüm nesneler büyük bir bellek yığınında saklanır (ancak rasgele sırada)" ifadesinde olduğu gibi "bitişik" mi demek istediniz?
Pablo H

1
Genel olarak, kendinizi "konteyner A ile konteyner B" olarak sorarsanız, cevap "hayır" dır, aksi takdirde sadece konteyner A olur (çünkü konteyner B'ye sahip olmanın amacı ne olurdu?). Bu elbette konteyner adaptörleri için geçerli değildir , ancak std::setburadaki anahtar şeylerden biri değildir.
Orbit'te Hafiflik Yarışları

Yanıtlar:


25

Std :: set nesneleri std :: vector gibi bitişik bellekte depolar mı?

Bunun garantisi yok. Ayrıca pratikte, kabın gereksinimleri nedeniyle olamaz. Bu nedenle hayır, nesneleri bitişik bellekte depolamaz.

Neden bitişik belleği kullanamadığını göremiyorum

Setin elemanlarına yapılan atıflar, silmenin yanı sıra eklendikten sonra da geçerli kalmalıdır (silinen öğeye yapılan referanslar hariç). Bu gereksinim bitişik bellekle uyumsuz.

Bildiğim kadarıyla, dengeli bir arama ağacı uygulayabilecek tek veri yapısıdır std::set.


OP'nin anlamı buysa, büyük bitişik parçalardan ağaç düğümleri için yer açabilir. (Ancak yineleyici geçersiz kılma, inserttüm düğümleri yalnızca bir blokla sınırlamak için yeni bir büyük bloğa kopyalamayı dışarıda bırakmaz, yerinde yeniden konum başarısız olursa veya (C ++ için tipik), ayırıcı böyle bir yeniden konumlandırmayı desteklemez.)
Peter Cordes

15

Belirli kısıtlamalar, std::setbitişik belleği kullanmayı imkansız hale getirmesine rağmen, açıkça hariç tutulmamaktadır .

Örneğin set::insert, logaritmik karmaşıklığa sahipken vector::insert, girişlerini karıştırmak için doğrusal karmaşıklık gerektirir. Ayrıca set::insertyineleyicileri geçersiz kılmaz. Her iki gereksinim koşullu bellek ile gerçekleştirilemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.