Frage zum vector der STL



  • Hallo,

    meine Frage bezieht sich auf den Umgang mit einem Iterator. Ist es erlaubt, in einer Schleife, die ich mit dem Iterator durchlaufe, weitere Schleifen einzusetzen? Zu gebrauchen wäre dies zB dann, wenn ich große Vectoren nach bestimmten Daten abfragen möchte.
    Also in der Form:

    for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
    {
        std::cout << ' ' << *it;
        while(it->get_name() == "x")
        {
        ...
        it++;
        }
    
      std::cout << '\n';
    
    }
    


  • Kein Problem. Allerdings prüfst Du in dem Beispiel nicht, ob die innere Schleife das Ende des Vektors erreicht.



  • Hallo Belli,

    danke dir. Ja, prüfen müsste ich es dann mit

    while(it != namen.end()-1 && it->get_name() == "x" )
    

    Also ein Element vor dem Ende abfangen. Oder?



  • Hallo,

    ich verstehe dein Vorhaben nicht so recht. Wenn du die Elemente des Vektors nach bestimmten Strukturen abfragen möchtest, dann hört sich das eher nach einer if Abfrage an:

    for(auto it = myvector.begin(); it != myvector.end(); ++it)
    {
      if( it -> get_name() == "x" )
        // do something
    }
    

    Vielleicht solltest du präziser beschreiben was du vorhast, bevor wir uns hier in Details verrennen.

    Gruß,
    -- Klaus.



  • Hallo Klaus,

    ja, if-Abfragen kommen viele vor. Jedoch möchte ich den Iterator im Vector immer wieder hoch- und runterfahren, um dann mit einer if-Abfrage entsprechende Reaktionen ausführen zu können. Beispiel:

    Der Vector hat die Namen:

    Magnus
    Adam
    Alex
    Steffi
    ...

    Sie kommen öfter vor und in verschiedener Reihenfolge. Nun möchte ich den Vector immer wieder komplett durchlaufen und nach jeweils einem bestimmten Namen abfragen, um diesen dann in vollständiger Anzahl in einer Textdatei auszugeben.

    Das Resultat soll dann sein:

    Magnus
    Magnus

    Adam
    Adam
    Adam

    etc.

    Deswegen schicke ich den Iterator vom Anfang bis zum Ende. Danach wieder zum Anfang und durchlaufe den Vector wieder. Deshalb war es für mich praktisch, einfach while-Schleifen innerhalb der for-Schleife einzusetzen. Das klappt auch gut. Wollte nur wissen, ob das in Ordnung ist. Die Beispiele, die ich mir angesehen habe, hatten innerhalb der for-Schleife niemals weitere while-Schleifen. Deswegen hatte ich die Befürchtung, dass das ggf. nicht erlaubt sei.


  • Mod

    Also so?

    #include <vector>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
      vector<string> names = {
        "Alfons",
        "Magnus",
        "Steffi",
        "Alex",
        "Magnus",
        "Alfons",
        "Adam",
        "Magnus",
        "Steffi",
        "Alfons",
        "Adam",
        "Alfons",
        "Adam",
        "Magnus",
        "Alfons",
        "Adam"};
    
      for(auto it1 = names.begin(); it1 != names.end(); ++it1)
        {
          cout << "Suche nach allen weiteren Vorkommen von " << *it1 << ":\n";
          for (auto it2 = it1 + 1; it2 != names.end(); ++it2)
            {
              if (*it1 == *it2)
                cout << "Gefunden: " << *it2 << '\n';
            }
          cout << '\n';
        }
     }
    

    Ja, das ist moeglich, wie du siehst.



  • Halo SeppJ,

    ja, genau. Danke dir.



  • Eine Map könnte hier noch praktisch sein

    map<string,int> histogramm(vector<string> const& sv)
    {
        map<string,int> result;
        for (auto& s : sv) {
            ++result[s];
        }
        return result;
    }
    

    Mir ist allerdings die Aufgabenstellung nicht 100%ig klar.


Log in to reply