3 Stimmen

C++: Erstes Element des Vektors "korrumpiert"

Ich habe eine Klasse (foo), die einen Vektor enthält.

Wenn ich versuche, Iteration über die Elemente in den Vektor wie so:

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

}

Das erste Element ist immer beschädigt und liefert Datenmüll.

Allerdings, wenn etwas tun, wie:

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

 }

Alles scheint gut zu funktionieren. Gibt es ein "Problem", das ich nicht kenne?

Ich habe auch versucht, cout << foo.getVector()[0] << endl; außerhalb der Schleife auszuführen, aber das scheint zu funktionieren.

Gracias.

編集する。

Hier ist meine Header-Datei:

#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

9voto

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

Der temporäre Vektor wird zurückgegeben, wenn Sie foo.getVector() und sie wird in dem Moment zerstört ; angetroffen wird, nachdem foo.getVector().begin(); Daher wird der Iterator innerhalb der Schleife ungültig.

Wenn Sie den Wert von foo.getVector(); im Vektor v ( v = foo.getVector(); ) und dann den Vektor v verwenden, funktioniert es gut. Das liegt daran, dass der Vektor v während der gesamten Schleife gültig ist.

7voto

GetVector() gibt einen Vektor als Wert zurück. Die beiden Aufrufe von getVector (begin() und end()) geben unterschiedliche Kopien des Vektors zurück, so dass Sie begin() bei einem Objekt und end() bei einem anderen aufrufen. Das Ergebnis sind zwei Iteratoren in zwei verschiedenen Containern. Vergleicht man diese beiden Iteratoren mit !=, so erhält man einen undefinierten Wert.

2voto

sharptooth Punkte 162790

GetVector() gibt den Vektor als Wert zurück, und im ersten Fall erhalten Sie eine temporäre Variable, die zerstört wird, sobald Sie sich in der Schleife befinden. Im zweiten Fall kopiert man das Ergebnis in eine lokale Variable, die innerhalb der Schleife noch aktiv ist. Eine mögliche Lösung ist die Rückgabe des Vektors über eine Konstantenreferenz.

1voto

Martin York Punkte 245363

Ihr Fehler liegt in der Methode getVector(). Rückgabe per Referenz.

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

Wenn Sie nicht per Verweis zurückkehren, erstellen Sie eine temporäre Kopie. Diese Kopie wird dann nach ihrer Verwendung zerstört. In diesem Fall wird das temporäre Objekt nach der Ausführung von begin() zerstört, so dass der von begin() zurückgegebene Iterator nicht gültig ist.

0voto

Ändern Sie die Funktion getVector so, dass sie den Objektverweis wie folgt zurückgibt: std::vector<word_idx_value>& getVector() {return speech_hits;}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X