it-swarm.com.de

Wie gehe ich durch die STL Map?

Sie müssen wissen, wie eine STL-Karte durchlaufen wird. Ich möchte den Schlüssel nicht verwenden. Ich interessiere mich nicht für die Bestellung, nur um auf alle darin enthaltenen Elemente zuzugreifen. Gibt es eine Möglichkeit, dies zu tun?

32
atoMerz

Ja, Sie können eine Standardbibliothek map durchlaufen. Dies ist die grundlegende Methode, die zum Durchlaufen einer map verwendet wird, und dient als Anleitung zum Durchlaufen einer Standardbibliotheksammlung:

C++ 03/C++ 11:

#include <cstdlib>
#include <map>
#include <string>
using namespace std;

int main()
{
    typedef map<int,string> MyMap;
    MyMap my_map;
    // ... magic

    for( MyMap::const_iterator it = my_map.begin(); it != my_map.end(); ++it )
    {
      int key = it->first;
      string value = it->second;
    }
}

Wenn Sie die Elemente ändern müssen: 

  • Verwenden Sie iterator anstelle von const_iterator.
  • Anstatt die Werte aus dem Iterator zu kopieren, rufen Sie eine Referenz ab und ändern Sie die Werte dadurch.

    for (MyMap :: iterator it = my_map.begin (); it! = my_map.end (); ++ it) { int key = it-> first; string & value = it-> second; if (value == "foo") value = "bar"; }

So durchlaufen Sie normalerweise Standard Library-Container von Hand. Der große Unterschied ist, dass für map der Typ von *it eine pair ist und nicht das Element selbst

C++ 11

Wenn Sie den Vorteil eines C++ 11-Compilers haben (z. B. neueste GCC mit --std=c++11 oder MSVC), haben Sie auch andere Optionen.

Zunächst können Sie das auto-Schlüsselwort verwenden, um diese böse Ausführlichkeit loszuwerden:

#include <cstdlib>
#include <map>
#include <string>
using namespace std;

int main()
{
    map<int,string> my_map;
    // ... magic

    for( auto it = my_map.begin(); it != my_map.end(); ++it )
    {
      int key = it->first;
      string& value = it->second;
    }
}

Zweitens können Sie auch Lambdas einsetzen. In Verbindung mit decltype kann dies zu saubererem Code führen (allerdings mit Kompromissen):

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    map<int,string> my_map;
    // ... magic

    for_each(my_map.begin(), my_map.end(), [](decltype(*my_map.begin()) val)
    {
        string& value = val.second;
        int key = val.first;
    });
}

In C++ 11 ist auch das Konzept einer for-Schleife für die Bereichsbasis enthalten, die Sie möglicherweise als ähnlich zu anderen Sprachen erkennen. Einige Compiler unterstützen dies jedoch noch nicht vollständig - insbesondere MSVC.

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    map<int,string> my_map;
    // ... magic

    for(auto val : my_map )
    {
        string& value = val.second;
        int key = val.first;
    }
}
60
John Dibling

Wie bei jedem STL-Container geben die Methoden begin() und end() Iteratoren zurück, die Sie zum Durchlaufen der Map verwenden können. Die Dereferenzierung eines Karten-Iterators ergibt einen std::pair<const Key, Value>.

11
fredoverflow

Sie können STL map auf dieselbe Weise wie jeder andere STL-Container durchlaufen: Verwenden von Iteratoren, z.

for (std::map<key, value>::const_iterator
     i = myMap.begin(), end = myMap.end(); i != end; ++i)
{
    // *i is a key-value pair
}
5
vitaut

C++ 17

Seit C++ 17 können Sie bereichsbezogen für Schleifen zusammen mit strukturierte Bindungen zum Durchlaufen einer Karte verwenden. Der resultierende Code, z.B. ist kurz und gut lesbar, um alle Elemente einer Karte zu drucken:

std::map<int, std::string> m{ {3, "a"}, {5, "b"}, {9, "c"} };

for (const auto &[k, v] : m)
    std::cout << "m[" << k << "] = " << v << std::endl;

Ausgabe:

m [3] = a
m [5] = b
m [9] = c

Code auf Colir

1
honk

Verwendung von for mit auto für C++ 11 und höher

map<int,int> map_variable; //you can use any data type for keys, as well as value

for(auto &x:map_variable)
{ 
    cout<<x.first ;// gives the key
    cout<<x.second; //gives the value
}

Das neuere Format von for mit auto wurde in C++ 11 eingeführt

Um ihm Funktionen zu geben, wie zum Beispiel Python

Dort gab es bereits eine Implementierung einer solchen Iteration

P.S. : map variable hält die Werte sortiert, so dass Sie beim Iterieren die Schlüssel in sortierter Reihenfolge erhalten

0
Harsh Sharma

Sie können die Karte mithilfe des automatischen Iterators wiederholen. 

Code-Auszug:

#include<bits/stdc++.h>
using namespace std;

int main()
{
      ios::sync_with_stdio(false);
      map<string, int> mp;

      mp["a"]=500;
      mp["b"]=200;
      mp["d"]=300;
      mp["c"]=400;

      for(auto it=mp.begin(); it != mp.end(); it++)
      {
         cout<<it->first <<" : "<<it->second<<endl;
      }
      return 0;
}
0
rashedcs