Przepływ sterowania za pomocą iteratorów

0

Pytanie

Powiedzmy, że mam coś takiego:

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

Czy doprowadzi to do nieskończonej pętli lub zakończy się po foo.size() iteracji? Innymi słowy, czy będzie last iterator będzie zaktualizowany jak foo wzrosła, lub zachowa wartość podaną w wywołaniu funkcji?

Zakładam, że last zmieniło się, tak jak to wskaźnik na pozycję, ale chciałbym uzyskać jakieś potwierdzenie.

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

Najlepsza odpowiedź

0

Czy doprowadzi to do nieskończonej pętli lub zakończy się po foo.size() iteracji?

Ani. To, co robisz, jest niepewne zachowanie z kilku powodów:

  • Zmieniasz vector podczas iteracji dla niego.

    Jeśli wektor rozkłada swoją wewnętrzną pamięć podczas przenoszenia nowego elementu, wszystkie istniejące iteratory w vectorunieważnione, w tym oba iteratora, z którymi używasz cykl. Ale nawet proste kliknięcie na nowy element zawsze unieważnia end() przynajmniej iterator.

    Cm. sekcja Zasady uznawania iteratora nieważne dla kontenerów C++

  • Można разыменовываете end() iterator, który nigdy nie odwołuje się do prawidłowego element.

Zakładam, że last zmieni się, tak jak to wskaźnik na pozycję

To nie może się zmienić, tak jak podał to w myFunc funkcja wartości, więc jest kopią oryginału end() iterator. Jeśli end() zmienia wartość, last wartość się nie zmieni, tak jak to jest kopia.

W każdym razie iteratory nie koniecznie są realizowane jako wskaźniki, ale wskaźniki są prawidłowe итераторами. Ale w tym przypadku to nie ma znaczenia. Nawet jeśli vector::iterator były tylko prostym wskaźnikiem, last będzie nadal będą unieważniane po każdym naciśnięciu/redystrybucji.

2021-11-18 21:20:33

Przekazanie wartości było zamierzone - pomysł polegał na tym, aby spróbować zmusić wektor powtarzać w aktualnych wartościach, dodając na końcu. Ma sens, że otrzymałem naruszenie zasad dostępu do pamięci w trakcie wykonywania operacji. Dzięki za plugin zasad nieważności (wiedziałem, że to, co szukałem, zostało udokumentowane, ale nie wiedziałem jak to ująć w słowa). I dziękuję za odpowiedź, stary. Naprawdę wszystko stało się jasne. Hura!
Pedro Barbeira

Ja bym proponował buforować wstawiania w lokalny wektor, a następnie dodać je na końcu wektora docelowego po zakończeniu iteracji.
Remy Lebeau

W innych językach

Ta strona jest w innych językach

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