Farkı bilmek deque
için genel olarak nasıl uygulandığını bilmek gerekir . Bellek eşit büyüklükteki bloklar halinde tahsis edilir ve birbirlerine zincirlenir (bir dizi veya muhtemelen bir vektör olarak).
Yani n'inci elemanı bulmak için uygun bloğu bulup içindeki elemana erişirsiniz. Bu sabit zamandır, çünkü her zaman tam olarak 2 aramadır, ancak bu yine de vektörden fazladır.
vector
ayrıca C API'leri oldukları veya bir işaretçi ve uzunluk almada daha çok yönlü oldukları için bitişik bir arabellek isteyen API'lerle de iyi çalışır. (Böylece altında bir vektöre veya normal bir diziye sahip olabilir ve bellek bloğunuzdan API'yi çağırabilirsiniz).
Nerede deque
bulunur en büyük avantajları vardır:
- Koleksiyonu her iki uçtan büyütürken veya küçültürken
- Çok büyük koleksiyon boyutlarıyla uğraşırken.
- Bool'larla uğraşırken ve gerçekten bir bit seti yerine bools istersiniz.
Bunlardan ikincisi daha az bilinir, ancak çok büyük koleksiyon boyutları için:
- Yeniden dağıtımın maliyeti büyük
- Bitişik bir bellek bloğu bulma zorunluluğu kısıtlayıcıdır, bu nedenle belleğiniz daha hızlı tükenebilir.
Geçmişte büyük koleksiyonlarla uğraşırken ve bitişik bir modelden bir blok modele geçtiğimde, 32 bitlik bir sistemde bellek dolmadan önce yaklaşık 5 kat daha büyük bir koleksiyon depolayabildik. Bunun nedeni kısmen, yeniden tahsis ederken, eski bloğu ve yeni bloğu, öğeleri kopyalamadan önce depolaması gerektiğidir.
Tüm bunları söyledikten sonra, std::deque
"iyimser" bellek tahsisi kullanan sistemlerde sorun yaşayabilirsiniz . A'nın yeniden tahsisi için büyük bir tampon boyutu talep etme girişimleri vector
muhtemelen bir noktada a ile reddedilse de bad_alloc
, ayırıcının iyimser doğası muhtemelen a tarafından talep edilen daha küçük tampon için talebi deque
karşılayacaktır ve bu muhtemelen işletim sistemi bir işlemi öldürmek için bir miktar bellek elde etmeye çalışır. Hangisini seçerse seçsin pek hoş olmayabilir.
Böyle bir durumda geçici çözümler iyimser tahsisi geçersiz kılmak için sistem düzeyinde bayrakları ayarlamak (her zaman mümkün değildir) veya belleği biraz daha manuel olarak yönetmek, örneğin bellek kullanımını kontrol eden kendi ayırıcınızı veya benzerini kullanmaktır. Açıkçası ideal değil. (Sorunuza vektörü tercih etme konusunda cevap verebilir ...)
std::deque
çok küçük bir maksimum blok boyutu var (~ 16 bayt, doğru hatırlıyorsam; belki 32) ve bu nedenle gerçekçi uygulamalar için çok iyi performans göstermiyor. Birdeque<T>
neredesizeof(T) > 8
(veya 16? Bu küçük bir sayı),vector<T*>
her bir öğenin dinamik olarak tahsis edildiği a ile yaklaşık aynı performans özelliklerine sahiptir . Diğer uygulamalar farklı maksimum blok boyutlarına sahiptir, bu nedenle farklı platformlarda nispeten aynı performans özelliklerine sahip kod yazmak zordurdeque
.