suche String in Vector



  • hallo, guten morgen

    existiert in C++ ein Befehl, welcher in einer Liste (Vector) nach einem bestimmten Wort sucht, oder muß ich dies in einer For-Schleife selbst erstellen. Der Inhalt des Vectors ist nicht sortiert.

    Gruß Siegfried 🙂



  • Da gibt es veschiedene Möglichkeiten. Was für einen Vektor genau hast du denn?
    Bsp.

    vector<string> test;
    // test füllen und jetzt nach einem string suchen
    vector<string>::iterator it = find(test.begin(), test.end(), "Suchstring");
    

    Bei TStringList gibt es z.Bsp. IndexOf



  • hallo,
    dieser Code nutze ich.

    Deklariere  *.cpp 
    std::vector<vector<vector<AnsiString> > >           vvvasMemoryAktion; 
    Deklariere  *.h 
    extern std::vector<vector<vector<AnsiString> > >    vvvasMemoryAktion
    

    Dieser Code ist für mich noch unbekannt, deshalb Frage, was liefer

    vector<string>::iterator it = find(test.begin(), test.end(), "Suchstring");
    

    zurück? bool oder int ? was ist, wenn der Suchstring nicht existiert. Zeile muß ich anpassen und werde dies gleich austesten!
    Gruß Siegfried 🙂

    hallo, habe mir dies zu leicht vorgestellt, benötige deine/eure Hilfe.
    dies ist meine Zeile.

    vvvasMemoryAktion[iBaGrNo][iBa][0];
    

    iBa ist der Such Count, den ich zur Zeit in einer for schleife nutze. ich möchte nach möglichkeit besseren/schneller Code einsetzen.

    Gruß Siegfried 🙂



  • Oh, bei dieser verschachtelten Struktur sieht es etwas komplizierter aus - da müsstest du auf drei Ebenen "parallel" nach deinem Suchstring suchen. Wenn du weißt, in welchem deiner Untervektoren der String sein könnte, kannst du find() auf diesen loslassen, andernfalls benötigst du find_if() und eine Hilfsfunktion, die alle Untervektoren durchsucht.

    Dieser Code ist für mich noch unbekannt, deshalb Frage, was liefer

    vector<string>::iterator it = find(test.begin(), test.end(), "Suchstring");
    

    zurück? bool oder int ? was ist, wenn der Suchstring nicht existiert.

    Das liefert einen Iterator (sowas wie ein Pointer, nur intelligenter) auf den gefundenen Suchstring zurück - wenn er nicht vorkommt, liefert es test.end().



  • Es wird (wie eigentlich zu sehen ist) ein Iterator auf das gefundene Element zurückgeliefert oder end() wenn nichts gefunden wurde.



  • hallo,
    du hast recht, "Oh, bei dieser verschachtelten Struktur sieht es etwas komplizierter aus"
    der erste und der dritte "Count" ist bei der Suche konstant.
    Gruß Siegfried



  • Beppo schrieb:

    der erste und der dritte "Count" ist bei der Suche konstant.
    Gruß Siegfried

    Wenn der erste und zweite Indexwert konstant wären, wäre es deutlich einfacher (find(data[i][j].begin(),data[i][j].end(),text);), aber so brauchst du eine Hilfsfunktion bzw. einen Funktor:

    struct has_val : public unary_function<bool,vector<string> >
    {
      has_val(int p,const string& v) : pos(p),val(v) {}
    
      bool operator()(const vector<string>& data)
      { return data[pos]==val; }
    
    private:
      int pos;
      string val;
    }
    
    vector<vector<string> >::iterator it = find_if(data[ind1].begin(),data[ind1].end(),has_val(ind3,text));
    

    (für ind1 und ind3 mußt du dann den "ersten bzw. dritten Count" aus deiner Aufgabe einsetzen)



  • hallo,
    danke für die ausführlich Hilfe. muß sehen, wie ich dies in meinem Programm einbinde. Hoffe wenn es funktioniert, das es auch eine verbesserung der Geschwindigkeit ergibt.
    Gruß Siegfried


Anmelden zum Antworten