首页 > 解决方案 > 基于范围的for循环将对象移动到另一个容器中?

问题描述

理想情况下,我想做这样的事情,但这安全/正确吗?从 some_list 移动到 other_list 时,您正在编辑 some_list 的内容,并且每次后续迭代都将无效,因为对象都包含空内容。

for (auto& object : some_list) {
    other_list.emplace_back(std::move(object));
}

有什么办法可以让这段代码更高效/更安全/更好,或者这是我能做到的最好的方式吗?

标签: c++for-looprangemove

解决方案


仅仅修改包含的对象不会使迭代器失效,所以这段代码是安全的。不过,不需要自己编写循环,因为有std::move算法:

#include <algorithm>
#include <iterator>

template<typename InContainer, typename OutContainer>
void append_back(InContainer& some_list, OutContainer& other_list)
{
    using std::begin;
    using std::end;
    std::move(begin(some_list), end(some_list), std::back_inserter(other_list);
    some_list.clear();
}

推荐阅读