Подтвердить что ты не робот

Как я могу пройти/перебрать карту STL?

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

4b9b3361

Ответ 1

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

С++ 03/С++ 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- > сначала; Строка & value = it- > second; if (value == "foo" )   value = "bar"; }

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

С++ 11

Если у вас есть преимущество компилятора С++ 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;
    });
}

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

С++ 17

Начиная с С++ 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] = а
m [5] = b
м [9] = с

Код на Колиру

Ответ 5

Вы можете выполнять итерацию карты с помощью автоматического итератора.

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

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

Ответ 6

Использование for с auto для С++ 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 был введен в С++ 11

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

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

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

Ответ 7

Его можно повторять даже в обратном порядке, как показано здесь !