Si tengo un vector de objetos (llanura de los objetos, no los punteros o referencias), ¿por qué no puedo hacer esto?

Object* object;

object = vectorOfObjects.end();

o

object = &vectorOfObjects.end();

o

object = &(*vectorOfObjects.end());

también la misma pregunta si «objeto» era una referencia.

  • Supongo que usted no tenía la intención de declarar el objeto como un puntero después diciendo explícitamente sus objetos de valor?
InformationsquelleAutor SirYakalot | 2012-02-04

4 Comentarios

  1. 12

    Son tres errores:

    object = vectorOfObjects.end();

    no va a funcionar porque end() devuelve un iterador, y object es un puntero. Esas son generalmente distintos tipos (Un vector puede su uso en crudo, punteros como iteradores, pero no todas las implementaciones de hacerlo. Otros contenedores requieren de especial tipos iterator).

    object = &vectorOfObjects.end();

    no funciona porque se toma la dirección de la devuelve el iterador. Es decir, se obtiene un puntero a un iterador, en lugar de un puntero a una Object.

    object = &(*vectorOfObjects.end());

    no funciona porque el end iterador no apunta a un elemento válido. Es uno de los puntos de más allá del final de la secuencia. Y así, no se puede anular la referencia. Usted puede eliminar el último elemento de la secuencia (que sería --vectorOfObjects.end()), pero no un iterador que apunta pasado el final.

    Finalmente, el problema de fondo/confusión podría ser que usted piensa que un iterador puede ser convertido a un puntero. En general, no se puede. Si el contenedor es un vector, tiene la garantía de que los elementos se asignan de forma contigua, como en una matriz, y así un puntero de trabajo. Pero, por ejemplo, un list, un puntero a un elemento es inútil. No te dan ningún camino para llegar a la siguiente elemento.

    • Muy concisa respuesta. 👍
  2. 3

    Porque .end() devuelve un iterador, no un Object, que ni siquiera es válido miembro del vector.

    Incluso el uso de begin(), que devuelve un objeto válido, tendría la siguiente:

    La forma correcta sería:

    std::vector<Object> vec;
    std::vector<Object>::iterator it;
    //....
    it = vec.begin();
    Object o = *it;
    • si (it!=vec.end() {s=*es;}
  3. 2

    Esto es debido a que por convenio end no apunta a una ubicación válida en el contenedor: se sienta en una ubicación de un pasado de la final del recipiente, para eliminar la referencia es ilegal.

    La situación con begin() es diferente: puede eliminar la referencia al v.begin() != v.end() (es decir, cuando el contenedor no está vacío):

    object = *vectorOfObjects.begin();

    Si usted necesita para acceder al último elemento, puedes hacer esto:

    vector<object>::const_iterator i = vectorOfObjects.end();
    i--;
    cout << *i << endl; //Prints the last element of the container

    De nuevo, esto sólo funciona cuando el vector contiene al menos un elemento.

    • Incluso si usted usa .empezar, no va a funcionar, la verdadera razón es que devuelven un iterador, que es un tipo diferente de objeto
    • Por eso he añadido un asterisco a la realidad eliminar el iterador, como la pregunta dice 🙂
    • Es start() de un error tipográfico para comenzar() ?
    • Sí, claro que lo es! Muchas gracias por señalándolo.
  4. -1

    Objeto* significa un puntero a un Objeto, donde un puntero es una dirección de memoria. Pero la .end() método devuelve un Iterador, que es un objeto en sí mismo, no es una dirección de memoria.

Dejar respuesta

Please enter your comment!
Please enter your name here