Ответ 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;
}
}