Struct Vektor durchsuchen



  • Tagchen,

    wie man im Titel wohl erkennen kann, möchte ich einen Struct Vektor durchsuchen, das Problem dabei ist das ich keine Ahnung habe wie ich das anstellen soll...

    Ich habe schon viele Antworten im Internet gefunden, dort wird gesagt ich müsste mir eine eigene Funktion schreiben die das suchen für mich übernimmt, leider waren die Erklärungen nicht ausreichend, sodass ich es nicht wirklich vestanden habe. (Anfänger und so ._.)

    Wäre vielleicht jemand so nett mir zu erklären wie ich das ganze anstelle?



  • Sag doch erstmal was du suchen möchtest.

    Hast du einen vector mit einfachen Werten und suchst die Position an der der Wert x eingefügt wurde?
    Oder hast du einen vector mit Personendaten und suchst den Eintrag von Heinz Müller um sein Geburtsdatum nachzuschlagen?



  • 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