Ovládání průtoku s iterátory

0

Otázka

Říkají, že mám něco jako tohle:

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

By to vést k nekonečné smyčce, nebo by to skončilo po foo.size() iterace? Jinými slovy, by last iterator být aktualizovány foo vyrostl, nebo by to zachovat hodnotu uvedenou ve volání funkce?

Já jsem za předpokladu, že last by se změnit, protože je to ukazatel na pozici, ale rád bych nějaké potvrzení.

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

Nejlepší odpověď

0

By to vést k nekonečné smyčce, nebo by to skončilo po foo.size() iterace?

Ani jedno. Co děláte, je nedefinované chování, pro několik důvodů:

  • Jste úpravou vector zatímco iterace.

    Pokud vektoru přiřadí jeho vnitřní paměti, když se tlačí nové položky, všechny existující iterátory do vector jsou neplatné, včetně obou iterátory používáte do smyčky. Ale i jen tlačí nové položky vždy znehodnocuje end() iterator, alespoň.

    Viz Iterator zneplatnění pravidla pro C++ kontejnerů

  • Jste dereferencing end() iterátor, který nikdy odkazuje na platný prvek.

Já jsem za předpokladu, že last by se změnit, protože je to ukazatel na pozici

To nemůže změnit, protože jste prošel ji do myFunc funkce podle hodnoty, tak to je kopie originálu end() iterátor. Pokud end() změny hodnoty, last nezmění hodnotu, protože to je kopírování.

V každém případě, iterátory nejsou nutně realizovány jako ukazatele, ale i ukazatele jsou platné iterátory. Ale nezáleží na tom, v tomto případě. I když vector::iterator byly jen jednoduchý ukazatel, last by ještě dostat neplatných na každý stisk/přerozdělení.

2021-11-18 21:20:33

Kolem hodnoty bylo úmyslné - myšlenka byla, aby se snažit , aby se vektor opakovat v aktuální hodnoty, zatímco přidání nové na konci. Dává to smysl, já byl stále paměti porušení přístupu při spuštění. Díky za zneplatnění pravidla plug (věděl jsem, co jsem hledal, bylo zdokumentováno, ale nevěděl, jak to formulovat). A díky za odpověď muže. Opravdu si to vyjasnili. Na zdraví!
Pedro Barbeira

Navrhoval bych, ukládání do mezipaměti vložky do místní vektor, a pak se připojit, že na konci cílový vektor po iterace je ukončena.
Remy Lebeau

V jiných jazycích

Tato stránka je v jiných jazycích

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