Vector mit Struct durchsuchen



  • Hallo,

    ich speichere ein struct bestehend aus vier Feldern (Name, Geb., Größe, Zahl) in einem Vector. Das Hinzufügen am Anfang oder am Ende funktioniert problemlos. Wie aber kann ich nach einem Feld z.B. "Name" im Vector suchen.
    Bisherige Versuche, das mittels Iterator zu realisieren waren wenig fruchtbar. Anbei die wesentlichen Teile des bisherigen Codes.

    Gruß
    Leo

    struct TPerson
    {
        char cName[20];
        TDateTime tdGeburtstag;
        float fGroesse;
        int iZahl;
    };
    
    // === Im *.h-File (Header) =========
    
    private:	// Anwender-Deklarationen
    
        TPerson mvTPerson;
    
    public:		// Anwender-Deklarationen
    
        typedef vector<TPerson> Container_gvTPerson;
        typedef Container_gvTPerson::iterator Iterator_gvTPerson;
        Container_gvTPerson gvTPerson;
    
    // === In *.cpp-File (Implementation) ========
    
    void __fastcall TForm3o::btn_sct_hinzu_amAnfangClick(TObject *Sender)
    {
    
        // Das 'leere' struct mvTPerson dem Vector am Anfang hinzufügen
        gvTPerson.insert(gvTPerson.begin(), mvTPerson); 
    
        // und anschließend mit Wert belegen.
        strcpy( gvTPerson[0].cName, txt_sct_Name_hinzu->Text.c_str() ); 
        gvTPerson[0].tdGeburtstag = StrToDateTime(txt_sct_Geburtstag_hinzu->Text);
        gvTPerson[0].fGroesse = StrToFloat(txt_sct_Groesse_hinzu->Text);
        gvTPerson[0].iZahl = StrToInt(txt_sct_Zahl_hinzu->Text);
    
       (…)
    


  • *yuck* ungarische Notation
    *yuck* verletzung des OpenClosed Prinzips

    http://www.sgi.com/tech/stl/find_if.html



  • kingruedi schrieb:

    *yuck* ungarische Notation
    *yuck* verletzung des OpenClosed Prinzips

    http://www.sgi.com/tech/stl/find_if.html

    Sehr geehrte(r) kingruedi,

    vielen Dank für die ausführliche Hilfe und die umfangreichen Erläuterungen. Werde sicherlich noch lange Freude dran haben - am Dechiffrieren!

    Mit freundlichstem Gruß
    Leo Freitag



  • öhm, ich hab dir einen Link gegeben, wo die Funktion beschrieben wird, die du suchst, inklusive Beispiel. Was hätte ich mehr machen sollen? Dir direkt die Antwort programmieren?



  • kingruedi schrieb:

    öhm, ich hab dir einen Link gegeben, wo die Funktion beschrieben wird, die du suchst, inklusive Beispiel. Was hätte ich mehr machen sollen? Dir direkt die Antwort programmieren?

    Hi,

    wenn wir das gleiche Beispiel meinen, dann ist mir damit nicht geholfen, da dort lediglich der Typ int behandelt wird.
    Ich dagegen suche nach Hilfe, um einen selbstdefinierten Typ z.B. struct (Name, Zahl, Zeit) zu behandeln, d.h. nach einer struct-Eigenschaft suchen zu können.

    Und, meinen wir das gleiche Beispiel?

    Gruß
    Leo



  • Leo Freitag schrieb:

    Und, meinen wir das gleiche Beispiel?

    Ja. Lies dir mal alles durch, dann kommst du schon auf die Lösung.
    Ob int, foo oder cocobeans ist ja egal - das prinzip ist immer das selbe.



  • Shade Of Mine schrieb:

    Leo Freitag schrieb:

    Und, meinen wir das gleiche Beispiel?

    Ja. Lies dir mal alles durch, dann kommst du schon auf die Lösung.
    Ob int, foo oder cocobeans ist ja egal - das prinzip ist immer das selbe.

    Hi,

    auf die Gefahr hin, dass ich hartnäckig erscheine, aber ich bräuchte vielleicht noch ein 'kleines' Bisschen Hilfe mehr.

    "Das Prinzip ist immer dasselbe", schreibst Du. Dass das für 'einfache' Typen zutrifft, war mir vor meiner ersten Mail schon klar. Nach wie vor unklar ist, wie ich dieses Prinzip auf ein struct anwende.

    Auf Barmherzigkeit hoffend grüßt
    Leo



  • struct blub {
      int foo;
      int bar;
    };
    
    bool find_value(const blub &o) {
      return o.foo==5;
    }
    
    int main() {
      std::vector<blub> vec;
      //vec füllen
      std::vector<blub>::iterator i=std::find_if(vec.begin(),vec.end(),find_value);
    }
    


  • kingruedi schrieb:

    [cpp]struct blub {
    int foo;
    int bar;
    };

    bool find_value(const blub &o) {
    return o.foo==5;
    }

    int main() {
    std::vector<blub> vec;
    //vec füllen
    std::vector<blub>::iterator i=std::find_if(vec.begin(),vec.end(),find_value);
    }

    Hi,

    habe versucht, Dein Beispiel umzusetzen (C++Builder), komme aber an einer Stelle nicht weiter. Die Zeile mit ' find_if ' bringt beim Kompilieren den Fehler "Wert vom Typ void nicht zulässig".

    Anbei ein Auszug aus dem Code:

    void __fastcall TForm_Vector_Struct_Iterator::Button1Click(TObject *Sender)
    {

    //vec füllen
    blub bl;
    bl.foo = 1;
    bl.bar = 101;
    vec.insert(vec.end(), bl); // Element am Ende hinzu

    bl.foo = 2;
    bl.bar = 102;
    vec.insert(vec.end(), bl); // Element am Ende hinzu

    bl.foo = 5;
    bl.bar = 105;
    vec.insert(vec.end(), bl); // Element am Ende hinzu

    bl.foo = 9;
    bl.bar = 109;
    vec.insert(vec.end(), bl); // Element am Ende hinzu

    std::vector<blub>::iterator i = std::find_if(vec.begin(), vec.end(), find_value);
    // An dieser Stelle Fehlermeldung:
    // [C++ Fehler] _algobase.c(192): E2468 Ein Wert vom Typ void ist nicht zulässig

    }
    //---------------------------------------------------------------------------



  • #include <algorithm>



  • Helium schrieb:

    #include <algorithm>

    Trotzdem gleiche Fehlermeldung



  • Ich hätte die Fehlermeldung vielleicht vorher mal lesen soll. Hmm, versthe ich nicht.

    Anders Thema: vectzor hat eine Methode push_back zum Einfügen am Ende

    vec.push_back(bl); // Element am Ende hinzu
    


  • [quote="kingruedi"]

    mit dem Functor soll schneller sein:

    struct find_value
    {
      bool operator()(const blub &o) const
      {
        return o.foo==5;
      }
    };
    
    ...
    std::vector<blub>::iterator i=std::find_if(vec.begin(),vec.end(),find_value());
    


  • der Fehler sieht merkwürdig aus. Hast du vielleicht eine sehr alte BCB Version?

    ssm schrieb:

    mit dem Functor soll schneller sein:

    struct find_value
    {
      bool operator()(const blub &o) const
      {
        return o.foo==5;
      }
    };
    
    ...
    std::vector<blub>::iterator i=std::find_if(vec.begin(),vec.end(),find_value());
    

    Der Compiler kann die Funktion doch auch so inlinen (?)



  • Der Compiler kann die Funktion doch auch so inlinen (?)

    Der BC aber mit Sicherheit nicht, wenn da kein inline steht dann inlined der nichts und über Funktionspointer kann der das schon gar nicht.



  • kingruedi schrieb:

    Der Compiler kann die Funktion doch auch so inlinen (?)

    nicht in diesem Fall, weil die Function über Funktionspointer aufgerufen wird.



  • *patsch* oh, klar.



  • kingruedi schrieb:

    *patsch* oh, klar.

    was bedeutet "*patsch*"?



  • Das er sich selbst vor den Kopf schlägt.



  • Hier wird aber find_if wharscheinlich auch geinlined und somit könnte er den Pointer auch in einen gewöhnlichen Funktionsaufruf umwandeln der dann natürlich geinlined werden kann.


Log in to reply