Pregunta

Tengo una clase (foo) que contiene un vector.

Si intento iterar sobre los elementos del vector así:

for(vector<random>::iterator it = foo.getVector().begin();
        it != foo.getVector().end(); ++it) {
  cout << (*it) << endl;

}

El primer elemento siempre está dañado y devuelve datos basura.

Sin embargo, si hace algo como:

 vector<random> v = foo.getVector();
 for(vector<random>::iterator it = v.begin();
            it != v.end(); ++it) {
      cout << (*it) << endl;

 }

Todo parece estar funcionando bien.¿Hay algún problema que no conozco?

También intenté hacer cout << foo.getVector()[0] << endl;fuera del bucle pero parece estar funcionando bien.

Gracias.

Editar:

Aquí está mi archivo de encabezado:

#ifndef HITS
#define HITS

#include <vector>
#include "wrappers.h"

class Hits {

    public:
        Hits();
        std::vector<word_idx_value> getVector() {return speech_hits;}
        const std::vector<word_idx_value> getVector() const {return speech_hits;}
        void add(const word_idx_value&);
        Hits &operator+=(const Hits&);
    private:
        std::vector<word_idx_value> speech_hits;
};

#endif
¿Fue útil?

Solución

for(vector<random>::iterator it = foo.getVector().begin();

El vector temporal se devuelve cuando lo haces. foo.getVector() y se destruye en el momento ; se encuentra después foo.getVector().begin(); Por lo tanto, el iterador deja de ser válido dentro del bucle.

Si almacena el valor de foo.getVector(); en el vector v ( v = foo.getVector();) y luego usa el vector v, funciona bien.Esto se debe a que el vector v es válido en todo el ciclo.

Otros consejos

getVector () devuelve un vector por valor. Los dos invocaciones de getVector (begin () y al final ()) devolver diferentes copias del vector, por lo que llamamos begin () en un objeto y fin () en otro. Lo que se obtiene es de dos iteradores en dos recipientes diferentes. Comparando los dos iteradores con! = Arroja un valor indefinido.

getVector () devuelve el vector en valor y en el primer caso se obtiene una variable temporal que se destruye una vez que estás dentro del bucle. En el segundo caso se copia el resultado en una variable local que aún está vivo, mientras que en el interior del bucle. Posible solución es volver vector por referencia const.

error está en el método getVector (). Devolver por referencia.

class Hits
{
    public:
    std::vector<word_idx_value>&   getVector() {return speech_hits;}
    //                         ^
    //                      Add the & to return by reference.

    // You may also want a const version at some point.
    std::vector<word_idx_value> const&   getVector() const {return speech_hits;}

Si Don; t retorno por referencia va a crear una copia temporal. La copia se destruye a continuación, después de que haya sido utilizado. En este caso, después de que el begin () ha ejecutado el objeto temporal se destruye, y por lo tanto el iterador devuelto por begin () no es válido.

modificar la función getVector para devolver la referencia del objeto de esta manera:   std :: vector & getVector () {speech_hits retorno;}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top