Ovládanie prietoku s iterátorov

0

Otázka

Povedať, že som niečo ako toto:

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

Bolo by to viesť k nekonečnej slučke, alebo by to koniec, potom foo.size() iterácie? Inými slovami, ako by sa last iterator byť aktualizované foo rástla, alebo by to zachovať hodnoty uvedené v vyvolanie funkcie?

Ja som za predpokladu, last by sa zmeniť, pretože je ukazovateľ na miesto, ale rád by nejaké potvrdenie.

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

Najlepšiu odpoveď

0

Bolo by to viesť k nekonečnej slučke, alebo by to koniec, potom foo.size() iterácie?

Ani jedno. Čo robíte je definované správanie, za pár dôvodov:

  • Ste úprava vector zatiaľ čo iterating cez to.

    Ak vektor reallocates jeho vnútornej pamäte, keď tlačí nová položka, všetky existujúce iterátorov do vectorneplatné, vrátane iterátorov, ktoré používate na slučky. Ale aj len tlačí nové položky vždy invalidates na end() iterator, aspoň.

    Pozri Iterator zrušenie pravidlá pre C++ kontajnerov

  • Ste na dereferencing end() iterator, ktoré nikdy odkazuje na platný prvok.

Ja som za predpokladu, last by sa zmeniť, pretože je to ukazovateľ polohy

To sa nedá zmeniť, pretože ste prešli do myFunc funkcia hodnotou, tak to je kópia originálu end() iterator. Ak end() zmeny hodnoty, last nebude zmeniť hodnotu, pretože to je kopírovanie.

V každom prípade, iterátorov nie sú nevyhnutne realizovať ako ukazovatele, ale odkazy sú platné iterátorov. Ale nezáleží na tom, v tomto prípade. Dokonca aj vtedy, ak vector::iterator boli len jednoduchý ukazovateľ, last ešte by si zrušená po každom push/prerozdelenie.

2021-11-18 21:20:33

Okolo hodnoty bolo úmyselné - cieľom bolo pokúsiť , aby vektor opakovať v súčasnej hodnoty a pridávanie nových sa na konci. Dáva to zmysel, bol som stále pamäť porušenie prístupu v run-time. Vďaka za zrušenie pravidlá plug (vedel som, čo som hľadal bolo zdokumentované, ale nevedel, ako na verbalize to). A vďaka za odpoveď človeka. Naozaj vymazané veci hore. Na zdravie!
Pedro Barbeira

Navrhoval by som, ukladanie do cache na vložky do miestnej vektor, a potom pridať, že na konci cieľovej vektor po iterácii je hotové.
Remy Lebeau

V iných jazykoch

Táto stránka je v iných jazykoch

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