How can I traverse/iterate an STL map?

前端 未结 6 534
栀梦
栀梦 2021-01-30 02:14

I want to traverse an STL map. I don\'t want to use its key. I don\'t care about the ordering, I just look for a way to access all elements it contains. How can I do this?

相关标签:
6条回答
  • 2021-01-30 02:50

    You can iterate map by using auto iterator.

    Code Snippet:

    #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 讨论(0)
  • 2021-01-30 02:54

    Yes, you can traverse a Standard Library map. This is the basic method used to traverse a map, and serves as guidance to traverse any Standard Library collection:

    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;
        }
    }
    

    If you need to modify the elements:

    • Use iterator rather than const_iterator.
    • Instead of copying the values out of the iterator, get a reference and modify the values through that.

      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"; }

    This is how you typically traverse Standard Library containers by hand. The big difference is that for a map the type of *it is a pair rather than the element itself

    C++11

    If you have the benefit of a C++11 compiler (for example, latest GCC with --std=c++11 or MSVC), then you have other options as well.

    First you can make use of the auto keyword to get rid of all that nasty verbosity:

    #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;
        }
    }
    

    Second, you can also employ lambdas. In conjunction with decltype, this might result in cleaner code (though with tradeoffs):

    #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;
        });
    }
    

    C++11 also instroduces the concept of a range-bases for loop, which you may recognize as similar to other languages. However, some compilers do not fully support this yet -- notably, 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;
        }
    }
    
    0 讨论(0)
  • 2021-01-30 02:55

    C++17

    Since C++17 you can use range-based for loops together with structured bindings for iterating over a map. The resulting code, e.g. for printing all elements of a map, is short and well readable:

    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;
    

    Output:

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

    Code on Coliru

    0 讨论(0)
  • 2021-01-30 03:01

    You can traverse STL map in the same way as any other STL container: using iterators, e.g.

    for (std::map<key, value>::const_iterator
         i = myMap.begin(), end = myMap.end(); i != end; ++i)
    {
        // *i is a key-value pair
    }
    
    0 讨论(0)
  • 2021-01-30 03:09

    Using for with auto for C++11 and above usage

    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
    }
    

    The newer format of for using auto was introduced in C++11

    To give it functionality like some higher level languages like python

    Where there was already an implementation of such type of iteration

    P.S. : map variable keeps values sorted, so when iterating you will get keys in sorted order

    0 讨论(0)
  • 2021-01-30 03:15

    As with any STL container, the begin() and end() methods return iterators that you can use to iterate over the map. Dereferencing a map iterator yields a std::pair<const Key, Value>.

    0 讨论(0)
提交回复
热议问题