2011-12-25 30 views
12

Yineleyici kullanarak set öğesini değiştirmek istediğimde sorun yaşıyorum. Bu basit kod ne yapmak istediğimi açıklayabilir.iterator tarafından değiştir öğesi

set<int> s; 
    s.insert(12); 

    set<int>::iterator it = s.begin(); 
    *it = 4; // error C3892: 'it' : you cannot assign to a variable that is const 

Neden normal yineleyici tarafından işaret edilen değeri değiştiremiyorum, const_iterator?

Kodumda yineleyici set :: find(). Belki de belirli öğeleri setten seçip değiştirmenin daha iyi bir yolu olabilir.

cevap

12

Bir küme, sipariş edilen bir kapsayıcıdır (özellikle, dengeli ikili arama ağaçları olarak uygulanır). Öğenin değerini yineleyici üzerinden değiştirebildiysen, sipariş değişmezi kırılmış olur. Neyi başarmaya çalıştığınıza bağlı olarak, farklı bir kap ile daha iyi durumda olabilir veya değeri elde edebilir, öğeyi kaldırabilir ve kümeye yeni bir öğe ekleyebilir.

+3

+1: Her ne kadar bu sorudan vazgeçse de: neden '' '' '' '' '' '' '' 'yinelemesiz '' yineleyici '' döndürür? –

+0

Normal bir yineleyici döndürmek kafa karıştırıcıdır, ancak şimdi en azından bu hatayı neden aldığımı anlayın. Çok teşekkürler. – Scypi

+0

@OliCharlesworth, Scypi: Bu biraz daha zorlayıcı, yineleyici 'const_iterator' değil, bir * değişebilir * yineleyici. Bu, değişmez * olanı indeksleyebilen "Anahtar" dır. §23.2.4p5 * "[...] İlişkili bir kapsayıcıdaki anahtarlar değişmezdir." * Yapmazlar neden başlangıçta değillerse() 've sonu (const_iterator'dan ziyade her zaman) tahminim şu ki Konteyner arayüzlerini mümkün olduğunca muntazam bir şekilde tutmak için yapılır. Özellikle §23.2.4p6, bu durumda "yineleyici" ve "const_iterator" * öğelerinin aynı olabileceğini ve ODR ihlallerini önlemek için her zaman "const_iterator" kullanılmasını önerir. –

İlgili konular