Struct Vektor durchsuchen
-
Ich habe eben einen Struct und in diesem struct sind 3 Datentypen (2x int, 1x bool).
Nun möchte ich den Vektor durchsuchen und prüfen ob es einen integer(nennen wir ihn mal
mit dem Wert 15 gibt, wenn ja dann möchte ich die Position des Structs mit dem Integer X zurückbekommen.
Ich möchte eben prüfen ob ein Struct bestimmte Werte hat und dann dessen Position zurückbekommen.Edit: Es kann zudem sein das es mehrere integer mit dem Wert 15 gibt, sobald ich eben einen Struct mit dem Wert 15 gefunden habe, prüfe ich noch die anderen Datentypen...
-
Unter Verwendung von
auto(C++11), Lambda-Ausdrücken (C++11) undstd::find_if()-- schlage wenn nötig auf www.cppreference.com nach:struct X { int i,j; bool b; }; std::vector<X> xs; auto itr = std::find_if(xs.begin(), xs.end(), [] (X x) { return x.i == 15; });Du kannst natürlich auch eine einfache Schleife schreiben.
-
So geht's:
-
Ethon schrieb:
So geht's:
[von Ideone]
// Den Vergleichsoperator implementieren damit ein Wert mit einer Zahl // verglichen werden kann. bool operator==(int zahl) { return zahl1 == zahl; }Der
operator==ist ein ziemlicher Hack, der nur für diese Suche nützlich ist. Wir wollen gar nicht Gleichheit, sondern nach einem bestimmten Kriterium suchen.Genau deshalb gibts
std::find_if(). Wenn der Fall mehrmals auftritt, kann man statt eines Lambda-Ausdrucks auch eine Funktion bzw. einen Funktor schreiben...
-
Also irgendwas mache ich falsch ich bekomme immer wieder C:\Dokumente und
"'itr' does not name a type" zurück, aber alles ist gleich, mal abgesehen vom Namen des Vektors...
-
Ja, dein Compiler kann wohl kein C++11.
Musst du entweder aktivieren (Compilerabhängig, welchen hast du?) oder "altes" C++ verwenden:bool i_is_15(your_struct x) {return x.i == 15;} ... std::vector<your_struct>::iterator iter = std::find_if(vec.begin(), vec.end(), i_is_15);
-
Ich benutze Codeblocks als Compiler, vielleicht kennt den ja jemand XD...
Wie kann ich dort den C++11 aktzivieren?
-
djeurissen schrieb:
Ich benutze Codeblocks als Compiler, vielleicht kennt den ja jemand XD...
Wie kann ich dort den C++11 aktzivieren?Rechtsklick auf das Projekt -> Properties -> Project Build Options -> Unter Compilerflags "Have g++ following the comming C++0x ..." auswählen.
-
Bzw. für C++11 ein neues Flag mit
-std=c++11erstellen.
-
Codeblocks ist übrigens eine IDE, der Compiler ist der gcc.
