Struct Vektor durchsuchen



  • Was ist ein Struct Vektor?



  • 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) und std::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.





  • 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++11 erstellen.



  • Codeblocks ist übrigens eine IDE, der Compiler ist der gcc. 😉


Anmelden zum Antworten