В C ++ 11, если вам больше не нужен старый вектор, возможно, вы могли бы получить небольшую дополнительную эффективность от семантики перемещения:
for (auto it = std::make_move_iterator(v.begin()),
end = std::make_move_iterator(v.end()); it != end; ++it)
{
v1.push_back(std::move(it->first));
v2.push_back(std::move(it->second));
}
Кроме этого, вы, конечно, не можетесделать лучше, чем один цикл.Вам нужно будет дотронуться до каждого элемента хотя бы один раз, так что это настолько эффективно, насколько это возможно.
Обратите внимание, что перемещение может иметь значение только в том случае, если сами типы элементов имеют семантику перемещения, которая лучше копирования.Это не относится к int
с или любым POD.Но это не помешает написать ваш код в общем, чтобы вы могли воспользоваться этим в будущих ситуациях.
Если копирование / перемещение является проблемой, тем не менее, вы должны подумать, есть ли какой-либо адаптер представления для вашего исходного вектораможет быть, лучший подход.