vector und Elementsuche



  • Wie du in jedem sequentiellen Feld ein Element findest.

    Auf jeden Fall führt die lineare Suche zum Ziel, wenn das Element enthalten ist.

    In Schleife solange den Vector abwandern, bis am Ende oder Treffer.
    == ist schon passend überladen.

    Ist i-tes Element eines vector<int> eine 3?

    if (vc[i]==3) ...
    


  • Danke, allerdings meine ich was anderes.

    Ich habe

    Elementtyp e;
    vector<Elemttyp> v;

    Wie suche ich in vector am einfachsten nach einem Element was (binär) gleich 'e' ist?

    Nochmals danke!



  • Wenn ich dich richtig verstanden habe, suchst du find.



  • Es gibt also keine Methode die mir Schleifenarbeit zur Suche abnimmt?
    Also sowas wie find() oder search()?



  • 😕
    Hast du dir den Link mal angesehen? Da ist doch auch ein Beispiel...

    Wenn du etwas anderes meinst, dann musst du es deutlicher erklären.



  • Wenn ich find() benutze passiert folgendes:

    typedef vector<egal> tut;

    void blah(tut* v)
    {
      egal e;
      tut::iterator it;
    
      tut = find(v->begin(), v->end(), e);
    }
    

    Dann sagt er mir in 'algorithm' bei der find() definition: "Binärer Operator '==': Es konnte kein Operator gefunden wird, der einen linksseitigen Operator vom Typ ... akzeptiert.



  • Korrektur:

    it = find(v->begin(), v->end(), e);



  • wichtig ist vielleicht noch:

    egal e; // Kein primitiver Datentyp



  • Hast du es mal mit integralen Typen probiert?
    Falls egal eine Klasse ist, muss diese eine Methode mit der Signatur

    bool egal::operator== (const egal&)
    

    besitzen, oder es muss eine Funktion der Signatur

    bool operator== (const egal&, const egal&)
    

    existieren.

    Übrigens, "Binärer Operator" heißt nicht, dass ein Vergleich auf Ebene der Binärdarstellung durchgeführt wird, sondern dass dieser Operator zwei Operanden entgegennimmt.



  • egal ist eine Struktur.
    Muss ich das dafür auch machen?



  • Strukturen sind in C++ Klassen (falls sie nicht nur POD-Elemente enthalten), also gilt für sie dasselbe.



  • OK, Danke!

    Mein Problem ist nur dass die Struktur in einem C-header definiert ist.
    Wie/wo muss ich da den Operator beschreiben?



  • Beispiel:

    xyz.h

    typdef struct
    {
      float x;
      float y;
    
      #ifdef __cplusplus
      bool operator== (const piVERTEX &a, const piVERTEX &b)
      {
        if( (a->x == b->x) && (a->y == b->y) ) return true;
      }
      #endif
    }
    

    Dann meckert der Compiler (2*): error C2143: Syntaxfehler: Es fehlt ',' vor '&'



  • Nimm lieber die Variante des globalen ==-Operators, der sollte auch mit C-Structs funktionieren. Du brauchst dafür nichtmal den Header zu ändern (was du auch nicht tuen solltest). Die Typen existieren bei der Deklaration der Funktion noch nicht, daher wird der Code nicht kompiliert (das nächste mal bitte den vollständigen Fehlertext).



  • Hmm...

    Wenn ich im Header zur cpp Datei, wo ich suchen möchte, einfüge:

    #ifdef __cplusplus

    bool operator== (const blah &a, const blah &b)
    {
    if( (a.x == b.x) && (a.y == b.y) ) return true;
    }

    #endif

    kommt der Compilerfehler (2*): error C2733: Zweite C-Bindung für überladene Funktion 'operator`=='' nicht zulässig



  • Hilfe! 😞



  • Ah...

    Wenn ich die Funktion in die .cpp schreibe funktioniert es.
    Warum nicht im header?


  • Mod

    Hünchen schrieb:

    Hmm...

    Wenn ich im Header zur cpp Datei, wo ich suchen möchte, einfüge:

    #ifdef __cplusplus

    bool operator== (const blah &a, const blah &b)
    {
    if( (a.x == b.x) && (a.y == b.y) ) return true;
    }

    #endif

    kommt der Compilerfehler (2*): error C2733: Zweite C-Bindung für überladene Funktion 'operator`=='' nicht zulässig

    die definition steht nicht zufällig in einem extern "C" block? im übrigen ist der operator selbst fehlerhaft ohne else bzw. fall-through case. besser ist nat. auf das if ganz zu verzichten und die bedingung innerhalb if direkt als return argument zu benutzen 😉 da der operator in einem header definiert wird, sollte er auch inline sein. es sei noch darauf verwiesen, dass ein op== nicht zwingend benötigt wird: das kann auch eine ganz normale funktion (oder funktor) sein wenn statt find find_if verwendet wird.



  • Lag tatsächlich am extern "C" block.
    Vielen Dank für die viele Hilfe!


Anmelden zum Antworten