Я хочу добавить дополнительный ответ на этот вопрос для людей, использующих итераторы C ++ 11 ...
Следующий код:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (auto i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
делает Скопируйте ключ и значение, так как "auto" является значением по умолчанию, а не ссылкой на const (по крайней мере, так ведет себя Clang 3.1).
Дополнительно, код:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const std::pair<std::string,std:string>& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
также копирует ключ и значение, поскольку правильный код должен быть:
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const auto& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}
или
std::map<std::string, std::string> m({{"a","b"},{"c","d"}});
for (const std::pair<const std::string,std:string>& i : m)
{
std::cout << i.first << ": " << i.second << std::endl;
}