Flujo de Control con los iteradores

0

Pregunta

Decir que tengo algo como esto:

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

Podría llevar esto a un bucle infinito, o es final después de foo.size() iteraciones? En otras palabras, sería el last iterador ser actualizado foo creció, o es conservar el valor dado en la llamada a la función?

Estoy suponiendo last iba a cambiar, ya que es un puntero a una posición, pero quisiera algunas de confirmación.

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

Mejor respuesta

0

Podría llevar esto a un bucle infinito, o es final después de foo.size() iteraciones?

Ninguno de los dos. Lo que estamos haciendo es un comportamiento indefinido, por un par de razones:

  • Se modifica el vector mientras que la iteración a través de ella.

    Si el vector reasigna su almacenamiento interno al empujar un nuevo elemento, todos los iteradores en el vector se invalida, incluyendo tanto los iteradores que está utilizando para con el bucle. Pero incluso sólo empujar un nuevo elemento siempre invalida el end() iterador, al menos.

    Ver Iterador invalidación de normas para C++ contenedores

  • Usted es eliminar la referencia de la end() iterador, que nunca se refiere a un elemento válido.

Estoy suponiendo last iba a cambiar, ya que es un puntero a una posición de

No puede cambiar, ya que se la pasó en el myFunc función de valor, por lo que es una copia de la original end() iterador. Si end() los cambios de valor, last no va a cambiar el valor, ya que es una copia.

En cualquier caso, los iteradores no son necesariamente implementado como punteros, pero los punteros son válidos los iteradores. Pero eso no importa en este caso. Incluso si vector::iterator se trata de una simple puntero, last aún así consigue invalidado después de cada inserción de reasignación.

2021-11-18 21:20:33

Se pasa por valor fue deliberada - la idea era tratar de hacer que el vector de iterar en los valores actuales, mientras que añadiendo nuevos en la final. Tiene sentido el que estaba el acceso a la memoria de las violaciones en tiempo de ejecución. Gracias por la invalidación de normas plug (yo sabía lo que yo estaba buscando era documentados pero no sabía cómo explicarlo,). Y gracias por la respuesta del hombre. Realmente aclarado las cosas. Saludos!
Pedro Barbeira

Yo sugeriría que el almacenamiento en caché de los insertos para un local de vectores, y, a continuación, anexar al final del vector blanco después de la iteración es terminado.
Remy Lebeau

En otros idiomas

Esta página está en otros idiomas

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