Как я могу пройти / перебрать карту STL? - PullRequest
34 голосов
/ 17 ноября 2010

В желании пройти карту STL.Я не хочу использовать его ключ.Меня не волнует порядок, я просто ищу способ получить доступ ко всем элементам, которые он содержит.Как я могу это сделать?

Ответы [ 6 ]

61 голосов
/ 17 ноября 2010

Да, вы можете пройти по стандартной библиотеке map.Это основной метод, используемый для обхода map, и служит руководством для обхода любой коллекции Стандартной библиотеки:

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

Есливам нужно изменить элементы:

  • Используйте iterator вместо const_iterator.
  • Вместо копирования значений из итератора, получите ссылку и изменитезначения через это.

    for (MyMap :: iterator it = my_map.begin (); it! = my_map.end (); ++ it) {int key = it-> first;строка & значение = это-> секунда;if (value == "foo") value = "bar";}

Именно так вы обычно проходите контейнеры стандартной библиотеки вручную.Большая разница в том, что для map тип *it является pair, а не сам элемент

C ++ 11

Если вы пользуетесь CКомпилятор ++ 11 (например, последний GCC с --std=c++11 или MSVC), затем у вас есть и другие варианты.

Сначала вы можете использовать ключевое слово auto, чтобы избавиться от всего этого неприятногомногословие:

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

Во-вторых, вы также можете использовать лямбды.В сочетании с decltype это может привести к более чистому коду (хотя и с компромиссами):

#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 также вводит концепцию цикла for на основе диапазонов, которую вы можете распознатькак и в других языках.Однако некоторые компиляторы еще не полностью поддерживают это, в частности 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;
    }
}
11 голосов
/ 17 ноября 2010

Как и в любом контейнере STL, методы begin() и end() возвращают итераторы, которые можно использовать для итерации по карте.Разыменование итератора карты дает std::pair<const Key, Value>.

5 голосов
/ 17 ноября 2010

Вы можете пройти STL карту так же, как и любой другой контейнер STL: используя итераторы, например,

for (std::map<key, value>::const_iterator
     i = myMap.begin(), end = myMap.end(); i != end; ++i)
{
    // *i is a key-value pair
}
1 голос
/ 27 марта 2019

C ++ 17

Поскольку C ++ 17 , вы можете использовать на основе диапазона для циклов вместе с структурированными привязками для итерации по карте. Полученный код, например, для печати всех элементов карты, является коротким и хорошо читаемым:

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;

Выход:

м [3] = а
м [5] = b
м [9] = с

Код на Coliru

0 голосов
/ 16 октября 2018

Использование for с auto для C ++ 11 и выше *

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
}

Более новый формат for с использованием auto был представлен в C ++ 11

Чтобы придать ему функциональность, такую ​​как некоторые языки более высокого уровня, такие как python

Там, где уже была реализация такого типа итерации

PS: переменная карты сохраняет значения отсортированными, поэтому при итерации вы получитеключи в отсортированном порядке

0 голосов
/ 08 июля 2017

Вы можете перебрать карту, используя автоматический итератор.

Фрагмент кода:

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