2010-11-22 18 views
2

Ich habe std::vector, die meine eigene Klasse enthält und ich muss auf seine Funktionen und Lücken zugreifen.C++ Zugriff auf Vektor

class A 
{ 
private: 
    int var; 
    vector<string> vec; 

public: 
    void setVar(int i) { var = i; } 
    void setVec(vector<string> a) { vec = a; } 
}; 

Ich habe auch Funktionen zurück, aber ich habe nicht die Mühe, sie zu tippen. Und ich habe alle notwendigen Dateien aufgenommen.

int main() 
{ 
    vector<A> vec; 
    for (int i = 0; i < 10; i++) 
    { 
     A tmp; 
     tmp.setVar(i); 
     vec.push_back(tmp); 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     vector<string> tmp; 
     tmp.push_back("1"); 
     tmp.push_back("2"); 
     tmp.push_back("3"); 
     vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range 
     vec[i].setVec(tmp);  //Crashes the whole programm 
    } 
} 

So wie ich da die vector diese Variablen gesetzt initialisiert?

Ich benutze g ++ und das ist nicht wirklich Code, weil mein tatsächlicher Code chaotisch ist.

Error for vec.at(i).setVec(tmp); 
Error is: terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 
+0

Dieser Code wird nicht für mich kompilieren. Sind Sie sicher, dass das Setup von 'tmp' hier Ihr tatsächlicher Code ist? Wenn ich das repariere, um etwas Gültiges zu tun, um 3 'string's im' vector' zu erstellen, läuft dieser Code gut. –

+1

Mit dem aktualisierten Code sehe ich keinen Grund, dass dies fehlschlagen sollte. Ist der Code, den Sie hier geschrieben haben, für Sie abgestürzt? –

Antwort

2

Welchen Compiler benutzen Sie? Ich bin wirklich sehr überrascht, dass std::vector<std::string> tmp("1","2","3"); sogar kompiliert!

Um ehrlich zu sein, ich habe keine Ahnung, was es nennt, aber ich wette, dass es nicht das, was man tut, erwarten, was ich glaube, ist:

std::vector<std::string> tmp; 
tmp.push_back("1"); 
tmp.push_back("2"); 
tmp.push_back("3"); 

Für die Aufzeichnung boost.assign und C++0x die Art bietet der Container-Initialisierung, die Sie versucht haben zu erreichen.

+2

Ich glaube, das ist Code gemacht. Wenn er 'vector tmp (" 1 "," 2 ") tippte:' hätte es kompiliert, aber es tut nicht, was erwartet wird. – ereOn

+0

Das war nicht mein tatsächlicher Code. Ich habe das gemacht, um die Bedeutung zu klären. Ich werde das reparieren. –

2

Der von Ihnen gepostete Code wird immer noch nicht kompiliert (keine tmp in der ersten Schleife deklariert), also lassen Sie mich im Allgemeinen erklären, was passiert.

Es gibt zwei Arten Fehler, die Sie erwähnt:

vec.at(i).setVec(tmp); //Works sometimes or causes error std::out_of_range 

Die Funktion at sicher sein will - es überprüft zunächst die Länge des Vektors, kehrt dann das Element des gegebenen Index oder wirft std::out_of_range, wenn die Vektor enthält nicht das Element eines solchen Indexes.

Der zweite Fall:

vec[i].setVec(tmp);  //Crashes the whole programm 

Operator [] verhält sich ähnlich wie die at() Funktion für Vektoren, aber es ist nicht „sicher“, da es keine Grenze Prüfung nicht tun. Wenn Sie also versuchen, auf das vierte Element eines 3-Elements zuzugreifen, greifen Sie einfach auf einen zufälligen Platz in Ihrem Speicher zu (könnte z. B. eine andere, nicht verwandte Variable sein, könnte alles andere sein). Wenn Sie Glück haben, stürzt Ihr Programm danach ab. Wenn Sie Pech haben, haben Sie Probleme mit der Speicherbeschädigung und sehr seltsame Fehler, die schwer zu finden sind.

Die Lösung für Ihr Problem ist:

a) Ersetzen vec[i] mit vec.at(i) - dem gleichen Arbeit (na ja, ein klein bisschen langsamer, aber Sie werden nicht das Gefühl, dass) und du bist sicher .

b) Dann: Sehen Sie sich alle Orte an, an denen Sie tatsächlich diese Vektorsuche durchführen und an jeder Stelle für eine Sekunde anhalten und überlegen: "Wie groß ist dieser Vektor in diesem Moment? Bin ich sicher, dass das Element dieses Indexes existiert? ".

Sie werden Ihren Fehler auf diese Weise schnell finden.

1

Ich habe Ihren Code in VS2010 versucht und war nicht in der Lage, das beschriebene Problem zu reproduzieren.Das Übergeben von Vektor nach Wert ist sicherlich keine gute Idee, es sollte ein Verweis auf eine Konstante sein, aber es kann keinen solchen Fehler verursachen. Nimmt man die Tatsache, dass 'std :: out_of_range' ausgelöst wird, ist die wahrscheinlichste Ursache, dass es kein Element mit einem solchen Index in Ihrem Vektor gibt. Zum Testen können Sie überprüfen, ob i < vec.size() vor dem Zugriff auf vec[i] (oder vec.at(i))

0

Ich habe ein Problem gefunden. Es war in der Funktion, die die Größe des Vektors behandelte. Anscheinend war der Vektor leer. Dummer Fehler. Vielen Dank für die Antworten.