Yineleyicilerle akışı kontrol etme

0

Soru

Böyle bir şey var demek :

void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
    while (first != last) {
        if ((*first) > (*last)) {
            T someT;
            v.push_back(someT);
        }
        first++;
    }
}

int main(){
    std::vector<T> foo = {some, T, values};
    myFunky(foo, foo.begin(), foo.end())
    return 0;
}

Bu sonsuz bir döngüye yol açar mı, yoksa sonra biter mi foo.size() yinelemeler mi? Diğer bir deyişle olurdu last yineleyici şu şekilde güncellenebilir foo büyüdü veya işlev çağrısında verilen değeri koruyacak mı?

Sanırım last bir pozisyona işaretçi olduğu için değişir, ancak bazı onaylar ister.

c++ controls flow iterator
2021-11-18 16:56:38
1

En iyi cevabı

0

Bu sonsuz bir döngüye yol açar mı, yoksa sonra biter mi foo.size() yinelemeler mi?

Hiçbiri. Yaptığınız şey, birkaç nedenden dolayı tanımlanmamış davranıştır:

  • Değiştiriyorsunuz vector yinelenirken.

    Vektör, yeni bir öğeyi iterken dahili depolama alanını yeniden tahsis ederse, mevcut tüm yineleyiciler vector döngü yapmak için kullandığınız her iki yineleyici de dahil olmak üzere geçersiz kılınır. Ancak sadece yeni bir öğeye basmak bile her zaman geçersiz kılar. end() en azından yineleyici.

    Bkz: C++ kapsayıcıları için yineleyici geçersiz kılma kuralları

  • Dereferans yapıyorsun end() hiçbir zaman geçerli bir öğeye başvurmayan yineleyici.

Sanırım last bir pozisyona işaretçi olduğu için değişecektir

Değiştiremez, çünkü sen onu geçtin. myFunc değere göre işlev, bu nedenle orijinalin bir kopyasıdır end() yineleyici. Eğer end() değeri değiştirir, last bir kopya olduğu için değeri değiştirmez.

Her durumda, yineleyiciler mutlaka işaretçiler olarak uygulanmaz, ancak işaretçiler geçerli yineleyicilerdir. Ama bu durumda önemli değil. Bile olsa vector::iterator sadece basit bir işaretçiydi, last her itme / yeniden dağıtımda hala geçersiz olur.

2021-11-18 21:20:33

Değerden geçmek kasıtlıydı-fikir, vektörün geçerli değerlerde yinelenmesini sağlamak ve sonunda yenilerini eklemekti. Çalışma zamanında bellek erişim ihlali alıyorum. Geçersiz kılma kuralları eklentisi için teşekkürler (aradığım şeyin belgelendiğini biliyordum, ancak nasıl sözelleştirileceğini bilmiyordum). Cevap için teşekkürler. Gerçekten her şeyi açıklığa kavuşturdum. Şerefe!
Pedro Barbeira

Ekleri yerel bir vektöre önbelleğe almanızı ve yineleme tamamlandıktan sonra bunu hedef vektörün sonuna eklemenizi öneririm.
Remy Lebeau

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................