2010-07-25 30 views
27

Diyelim ki bir çeşit koleksiyonum var ve bunun başlangıcı için bir yineleyici aldım. Şimdi koleksiyonu değiştirdiğimi varsayalım. Koleksiyonun veya yineleyicinin türünden bağımsız olarak yineleyiciyi güvenle kullanabilir miyim?STL yineleyiciler, koleksiyon değiştirildikten sonra geçerliliğini garanti eder mi?

  1. koleksiyonunun bir yineleyici alın:

    karışıklığı önlemek için, burada Bahsetmek operasyonların sırasıdır.

  2. Koleksiyonu değiştir (açıkta bir öğeyi değil, koleksiyonun kendisini).
  3. Adım 1'de elde edilen yineleyiciyi kullanın. STL standardına göre geçerli midir ?!
+0

Hızlı yanıtlar için hepinize teşekkür ederiz. – user88637

cevap

40

Konteynere bağlı olarak. Örneğin. vector ise, kapsayıcıyı değiştirdikten sonra tüm yineleyiciler geçersiz kılınabilir. Ancak, list ise, değiştirilen yerle alakasız yineleyiciler geçerli kalır. bellek tahsis edildiğinde

  • bir vektörün yinelemeler geçersiz kılınır. Ek olarak, bir öğenin ortasında bir öğenin eklenmesi veya silinmesi, ekleme veya silme noktasından sonraki öğelere işaret eden tüm yineleyicileri geçersiz kılar. Bu, bir vektörün yineleyicilerinin, vektörün kullanacağı kadar belleği önceden belleğe almak için reserve()'u kullanırsanız ve tüm ekleme ve silme işlemleri vektörün sonunda bulunuyorsa geçersiz hale gelmesini önleyebilirsiniz.

  • deque için yineleyici geçerliliğinin semantiği aşağıdaki gibidir. Insert (push_front ve push_back dahil), deque numaralı belgeye başvuran tüm yineleyicileri geçersiz kılar. deque'un ortasındaki Erase, deque'a başvuran tüm yineleyicileri geçersiz kılar. Bir deque'un (pop_front ve pop_back dahil) başlangıcındaki veya sonundaki bir yineleyici, yalnızca silinen öğeye işaret ettiğinde geçersiz kılar. [2]

  • List ler sokulmadan ve ekleme elemanları listelemek iteratörler geçersiz kılmaz önemli özelliği vardır ve bu hatta kaldırma kaldırılır elemanları işaret yalnızca yineleyiciler geçersiz kılmaktadır. [3]

  • Map bir map içine yeni bir öğe ekleyerek mevcut elemanların işaret yineleyicinızı geçersiz kılmaz önemli özelliği vardır. Bir öğenin bir haritadan silinmesi, elbette, silinmekte olan öğeye gerçekten işaret eden yineleyiciler haricinde, yineleyicileri geçersiz kılmaz. Söz konusu koleksiyonu bağlıdır

+1

Ancak, "vector :: insert" (tek öğe) ve "vector :: erase", yeni, geçerli bir yineleyici döndürür. –

+1

Kenny: Standart ya da doğruya göre doğru dediğiniz şey, çünkü bu genellikle nasıl uygulanır? Cevabınızı değiştirebilir, böylece açıklayabilir misiniz? Teşekkürler. – user88637

+8

@ yossi1981: Bu standart tarafından tanımlanmıştır. Yineleyicilerin geçersiz kılındığı koşullar, standartta çok açık bir şekilde tanımlanmıştır. –

4

Hayır yineleyiciler, yinelenen konteyner değişmeden sadece iyidir. Bir koleksiyon değiştirilirse, yineleyici yeni alınmalıdır.

+1

Kesinlikle bu doğru değil (örnek liste bu kurallara uymuyor). –

+1

Soru "koleksiyonun türüne (konteyner) bakılmaksızın" sorulmuştur. – m1tk4

+0

Sorundan bağımsız olarak, cevabınızda yapılan açıklama yanıltıcıdır, çünkü bazı durumlarda doğrudur ve (birçok) diğerlerinde yanlıştır. – user487158

8

(set, multiset ve multimap için aynı) [4]. Örneğin, örneğin, bir std::vector değiştirerek (örn., Bir yere bir öğe ekleyerek), tüm yineleyicileri bu vektöre geçersiz kılabilir.Buna karşılık, bir std::list ile, listeye başka bir öğe eklediğinizde yineleyiciler geçerli kalır. Bazı durumlarda, kurallar daha da karmaşıktır (örneğin, bellek hizmet veriyorsa, std::deque ile, varolan yineleyiciler geçerli veya geçerli olmaktan çıkıyor, ancak başka herhangi bir yere eklemek onları geçersiz kılabilir - ancak belleğim yeterince zayıf buna bağlı olarak önce kontrol edin).

+2

Bir liste öğesini silerseniz ne olur? Ya yineleyicinin işaret ettiği unsursa? – m1tk4

+0

Yineleyici tarafından belirtilen öğenin silinmesi, yineleyiciyi geçersiz kılar. Başka herhangi bir öğe (ler) silinmez. –

+0

Başka bir deyişle, listeyi değiştirirseniz, yineleyiciyi geçersiz kılacak koşullar vardır (silinen öğeye işaret eder), böylece yineleyici geçerliliği garanti edilmez - doğru mu? – m1tk4

İlgili konular