В хотите пройти карту STL. Я не хочу использовать его ключ. Меня не волнует порядок, я просто ищу способ получить доступ ко всем элементам, которые он содержит. Как я могу это сделать?
Как я могу пройти/перебрать карту STL?
Ответ 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
Его можно повторять даже в обратном порядке, как показано здесь !