Flusso di controllo con iteratori

0

Domanda

Dire di avere un qualcosa di simile a questo:

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

Porterebbe a un loop infinito, o sarebbe la fine dopo foo.size() iterazioni? In altre parole, sarebbe il last iteratore essere aggiornato foo è cresciuto, o sarebbe mantenere il valore determinato in funzione di chiamata?

Sto assumendo last vorresti cambiare, dal momento che è un puntatore a una posizione, ma vorrei qualche conferma.

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

Migliore risposta

0

Porterebbe a un loop infinito, o sarebbe la fine dopo foo.size() iterazioni?

Nessuno dei due. Quello che stai facendo è un comportamento indefinito, per un paio di motivi:

  • Si sta modificando il vector mentre l'iterazione attraverso di essa.

    Se il vettore rialloca memoria interna quando si spinge un nuovo elemento, tutti gli iteratori in vector sono invalidati, includendo sia gli iteratori che si sta utilizzando per ciclo con. Ma anche semplicemente premendo un nuovo elemento sempre invalida la end() iteratore, almeno.

    Vedere Iteratore invalidazione regole per il C++ contenitori

  • Si sono dereferenziazione il end() iteratore, che non si fa mai riferimento a un elemento valido.

Sto assumendo last vorresti cambiare, dal momento che è un puntatore a una posizione

Non può cambiare, dal momento che passato nel myFunc funzione per valore, quindi è una copia dell'originale end() iteratore. Se end() cambia il valore, last non cambiare il valore, dal momento che si tratta di una copia.

In ogni caso, gli iteratori non sono necessariamente implementato come puntatori, ma i puntatori sono validi gli iteratori. Ma non importa in questo caso. Anche se vector::iterator sono solo un semplice puntatore, last sarebbe ancora ottenere invalidato su ogni push/riallocazione.

2021-11-18 21:20:33

Passaggio per valore era intenzionale - l'idea era di provare a fare il vettoriale scorrere in valori correnti, mentre l'aggiunta di nuovi quelli alla fine. Senso mi è stato sempre memoria violazioni di accesso a run-time. Grazie per l'invalidazione regole spina (sapevo quello che stavo cercando era documentato, ma non sapevo come verbalizzare). E grazie per la risposta l'uomo. Davvero cancellato le cose. Evviva!
Pedro Barbeira

Vorrei suggerire di memorizzazione nella cache gli inserti di un vettore locale, e quindi aggiungere che alla fine del vettore bersaglio dopo l'iterazione è finito.
Remy Lebeau

In altre lingue

Questa pagina è in altre lingue

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