Controlul fluxului cu iteratori

0

Problema

Spun că am avea ceva de genul asta:

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;
}

Acest lucru ar duce la o buclă infinită, sau s-ar fi sfârșit după foo.size() iterații? Cu alte cuvinte, ar last iterator fi actualizat, după cum foo a crescut, sau și-ar păstra valoarea dată în apel de funcție?

Presupun last s-ar schimba, deoarece este un pointer la o poziție, dar ar dori o confirmare.

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

Cel mai bun răspuns

0

Acest lucru ar duce la o buclă infinită, sau s-ar fi sfârșit după foo.size() iterații?

Nici una nici alta. Ceea ce faci este nedefinit de comportament, pentru un cuplu de motive:

  • Ești modificarea vector în timp ce iterarea prin ea.

    Dacă vectorul realocă sale de stocare intern, atunci când împinge un element nou, toate existente iteratori în vector sunt invalidate, inclusiv iteratori utilizați la curent cu. Dar chiar și împinge doar un element nou mereu invalidează end() iterator, cel puțin.

    Vezi Iterator invalidarea normelor pentru C++ containere

  • Ești dereferencing end() iterator, care nu se referă la un element valid.

Presupun last s-ar schimba, deoarece este un pointer la o poziție

Nu se poate schimba, din moment ce a trecut în myFunc funcție de valoarea, deci este o copie a originalului end() iterator. Dacă end() modificări de valoare, last nu se va schimba valoarea, deoarece este o copie.

În orice caz, iteratori nu sunt în mod necesar puse în aplicare ca indicii, dar indicii sunt valabile iteratori. Dar nu contează în acest caz. Chiar dacă vector::iterator a fost doar un simplu pointer, last tot ar fi invalidat pe fiecare apăsare/realocare.

2021-11-18 21:20:33

Trecerea de valoare a fost deliberată - ideea a fost de a încerca să facă vector repeta în valori curente, în timp ce adăugarea de noi la sfârșitul anului. Logic, am fost obtinerea de acces la memorie încălcări la run-time. Multumesc pentru invalidarea normelor plug (eu știam ce am fost în căutarea pentru, a fost documentată, dar nu știu cum să o spun). Și mulțumesc pentru răspunsul om. Într-adevăr clarificat lucrurile. Noroc!
Pedro Barbeira

Aș sugera cache insertii la un local din vector, iar apoi se va adăuga la sfârșitul țintă vector după repetare este terminat.
Remy Lebeau

În alte limbi

Această pagină este în alte limbi

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