Я знаю, что это с 2009 года, но, чтобы ответить на вторую часть вопроса, да, в std
есть алгоритмы для копирования элементов между диапазонами. При копировании между контейнерами с одним и тем же типом значения использование std::copy
с std::inserter
приведет к:
map<string, int> wordsA;
multimap<string, int> wordsB;
copy(wordsA.begin(), words.end(), inserter(wordsB, wordsB.begin()));
Поскольку вы копируете в контейнер другого типа, вы можете использовать std::transform
, чтобы применить функцию преобразования к элементам перед вставкой их во второй контейнер:
transform(words.begin(), words.end(),
std::inserter(words2, words2.begin()),
[](const pair<string, int>& x) -> pair<int, string>
{
return make_pair(x.second, x.first);
}
);
Как обычно, на самом деле получается больше строк кода, чем в вашем простом цикле, и, по сути, выполняется то же самое:)
Обратите внимание, что std::copy
, std::transform
и т. Д. ... будут работать практически с любым контейнером из std
. Это не относится только к std::map
. Вы также можете использовать std::front_inserter
и std::back_inserter
с контейнерами, которые имеют push_front()
соотв. push_back()
методов.