Controle de fluxo com iteradores

0

Pergunta

Dizem que eu tenho algo parecido com isto:

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

Isso levaria a um loop infinito, ou iria acabar depois foo.size() iterações? Em outras palavras, seria o last o iterador de ser atualizado como foo cresceu, ou seria manter o valor dado a chamada de função?

Eu estou supondo que last iria mudar, já que é um ponteiro para uma posição, mas gostaria de alguma confirmação.

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

Melhor resposta

0

Isso levaria a um loop infinito, ou iria acabar depois foo.size() iterações?

Nenhuma. O que você está fazendo é um comportamento indefinido, por um par de razões:

  • Você está modificando o vector embora iterar através dele.

    Se o vetor realoca armazenamento interno, quando recebe um novo item, todos os iteradores para o vector são invalidados, incluindo tanto os iteradores você estiver usando um loop com. Mas, até mesmo, empurrando um novo item sempre invalida o end() iterator, pelo menos.

    Ver Iterador invalidação regras para C++ contentores

  • Você está desreferência end() iterator, que nunca se refere a um elemento válido.

Eu estou supondo que last iria mudar, já que é um ponteiro para uma posição

Ele não pode mudar, desde que você passou para o myFunc função de valor, portanto, é uma cópia do original end() iterador. Se end() mudança de valor, last não vai alterar o valor, uma vez que é uma cópia.

Em qualquer caso, os iteradores não são necessariamente implementado como ponteiros, mas os ponteiros são válidos os iteradores. Mas isso não importa nesse caso. Mesmo se vector::iterator eram apenas um simples ponteiro, last ainda fica invalidada a cada emissão/realocação.

2021-11-18 21:20:33

Passagem por valor foi deliberada - a idéia era tentar fazer o vetor de iterar em valores atuais, ao acrescentar novos no final. Faz sentido, eu estava ficando violações de acesso de memória em tempo de execução. Obrigado pela invalidação de regras de tomada (eu sabia o que eu estava procurando era documentado, mas não sabia como verbalizou). E obrigado pela resposta homem. Realmente limpo as coisas. Saúde!
Pedro Barbeira

Gostaria de sugerir a colocação em cache as pastilhas para um local de vetor e, em seguida, acrescentar que, para o final da meta vetor após a iteração é terminado.
Remy Lebeau

Em outros idiomas

Esta página está em outros idiomas

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