2012-07-05 18 views
10

std::list<>::splice yapmanın ardındaki mantığın yeni kapsayıcıya eklenmiş olan alt dizeye başvuran yineleyicileri geçersiz kılmasının ne olduğunu merak ediyorum. Bu, özellikle standart std::container::swap spesifikasyonunun ışığında bana mantıksız geliyor. Dil standardına göre std::container::swap hiçbir yineleyici geçersiz kılmaz. Bu kesinlikle makul bir pratik özelliktir. Bununla birlikte, std::list<>::splice'un yineleyici koruma davranışından büyük ölçüde fayda sağlayacağını söyleyebilirim. Ben yineleyici erişilebilirlik vb kavramlar üzerinde Ama aynı zamanda splice de dayalı bazı tamamen akademik hususlar olabileceğini anlıyoruzstd :: list <> :: ekleme, yineleyicileri geçersiz kılar. Gerekçe?

muhtemelen bunun için özel olarak uyarlanmış şartname olmaz sağlanması anlamına gelen bir std::list ya spesifik bir işlemdir Genel olarak STL tasarımında ciddi bir kavramsal hasar meydana getirir.

Peki, neydi? Fark edemediğim std::list'un bazı pratik uygulamalarını yasadışı mı yoksa aşırı mı uyguluyor?

+0

[splice() 'ın std :: list ve yineleyici geçersiz kılınması için olası kopyası] (http://stackoverflow.com/questions/143156/splice-on-stdlist-and-iterator-invalidation) – jwismar

cevap

7

C++ 11'de splice yineleyicileri geçersiz kılmaz, ancak bunları *this kapsayıcısında uygun öğelere yönlendirmelidir. Bunların hepsi 23.3.5.5'te açıklanmıştır.

+0

Oh, Tamam. Sadece bunu buldum. Yani, görünüşe göre, geçersiz kılma şartı için iyi bir sebep yoktu. Benim sorum, Microsoft'un, hem takas ve hem de ekleme için "yineleyici hata ayıklama" desteği sağlamak için Microsoft'un STL uygulamasında ne kadar döngü ve döngü atlattığını gördükten sonra ortaya çıkıyor. Cevap için teşekkürler. – AnT

+0

@AndreyT "_So, görünüşe göre, geçersiz kılma gereksinimi için iyi bir neden yoktu." Bir noktada, komite _unequal_ bellek ayırıcılarını tam olarak desteklemeyi istemişti ve bu ayırıcılar uyumlu değillerdi, bu nedenle de çok özel bir dosyaya ihtiyaç duyuldu. – curiousguy

4

Kaplar özelleştirildiyse, eşit olmayan (uyumlu olmayan) allocators, işaretçileri değiştiremezsiniz, gerçekten öğelerinizi kopyalamaktan başka seçeneğiniz yoktur.

İlgili konular