Да, вы можете пройти по стандартной библиотеке 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;
}
}