Strings in einer Liste zählen



  • Hi,

    ich habe eine Liste von Strings:

    vector<string>  labels; 
    for (int i = 0; i < irgendeine_Konstante; ++i)
        {labels.push_back("...");}
    

    Jetzt will ich in dieser Liste die Vorkommen aller Elemente zaehlen. Mein Versuch:

    #include <algorithm>
    ...
    for (vector<string>::iterator it = labels.begin(); it!=labels.end(); ++it)
        {int counter=0;
         count(labels.begin(),labels.end(), (*it), counter);
         ...
        }
    

    scheitert, da der Compiler meint:
    ...: no matching function for call to `count(
    __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string,
    std::allocatorstd::string > >, __gnu_cxx::__normal_iterator<std::string*,
    std::vector<std::string, std::allocatorstd::string > >,
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >&,
    int&)'

    Wer kann mir sagen, was ich falsch mache? Vielen Dank, LIBS



  • Als erstes, Du hast einen vector von string. (keine Liste)
    Du kannst dann mit:

    vector<string> bla;
    string txt;
    for (i=0; i<bla.size(); i++)
    {
     txt=bla[i];
     //txt enthält jetzt den string am index i
    }
    

    dann darauf zugreifen



  • Warum nimmst Du nicht

    int Anzahl = labels.size()
    

    😕



  • @Cosmixx: labels.size() liefert die Anzahl aller Elemente in labels, ich will aber wissen wie oft z.B. der String "Teppichluder" 😃 vorkommt.

    @daishi: der Iterator zeigt genauso auf den aktuellen string, daran sollte es nicht liegen.



  • Ups, mal wieder zu schnell gelesen 🤡

    Aber sieht count() nicht so aus? :

    counter = count( labels.begin(), labels.end(), (*it) );
    


  • #include <algorithm> 
    #include <map>
    
    map<string, unsigned> counts;
    for (vector<string>::const_iterator it = labels.begin(); it != labels.end(); ++it)
    {
        if (counts[*it] == 0)
            // Noch nicht gezählt, sonst wäre die Anzahl mindestens 1
            counts[*it] == count(labels.begin(), labels.end(), *it);
    }
    


  • Aha, die Version die den Zähler als Referenz mitbekommt scheint nicht mehr zu existieren ... jetzt läuft es auf jeden Fall 👍 Danke!



  • warum nicht einfach

    map<string,unsigned> m;
    
    for (int i = 0; i < labels.size(); ++i) m[labels[i]]++;
    


  • Autsch. Das ist ja zu billig um wahr zu sein *schäm* 🙂



  • davie schrieb:

    warum nicht einfach

    map<string,unsigned> m;
    
    for (int i = 0; i < labels.size(); ++i) m[labels[i]]++;
    

    Hat das irgendwelche Vorteile gegenüber count_if?



  • worauf willst du hinaus?
    wie willst du das mit count_if implementieren? noch kürzer? noch schneller?
    hab ich ein brett vorm kopf?



  • Davies Variante ist ideal wenn man alle Strings zaehlen will.
    count_if empfiehlt sich, wenn man nur ein paar Strings zaehlen will.



  • davie: Naja, ich habe das

    LIBS schrieb:

    @Cosmixx: labels.size() liefert die Anzahl aller Elemente in labels, ich will aber wissen wie oft z.B. der String "Teppichluder" 😃 vorkommt.

    so interpretiert dass er nicht von jedem string in der Liste wissen möchte wie oft er vorkommt sondern nur einen bestimmten string in der Liste zählen möchte, dafür wäre count_if definitiv die beste Lösung gewesen.



  • ok, klar. das war vom op etwas missverständlich ausgedrückt.
    aber count_if verwendet man normalerweise, wenn man ein eigenes prädikat geschrieben hat. ansonsten reicht ein simples

    int anzahl_teppichluder = count(v.begin(),v.end(),"Teppichluder");
    


  • Will man wissen wie oft
    "Test"

    in einer Liste mit Test Test2 Test3 vorkommt ist count ideal.

    Will man wissen wie oft Test Test2 Test3 vorkommt scheint mit die map ne gute Idee zu sein.

    Ist jetzt nur die frage was mit

    Jetzt will ich in dieser Liste die Vorkommen aller Elemente zaehlen

    gemeint ist.



  • davie: Naja, für case-insensitive-Geschichten sind eigene Prädikate recht praktisch, daher macht teils auch count_if Sinn. (Ich verwende ganz gerne case-insensitive searches.)

    Knuddlbaer: Vermutlich zweiteres, war nur nicht ganz klar formuliert finde ich.


Anmelden zum Antworten