我想在另一个向量的末尾追加一个向量。根据我的知识,函数std::move()
是选择的函数"为了这个任务。为什么来自Microsoft Visual C ++ Express的std::move()
在手工制作的循环按预期工作时会崩溃?
我正在使用Microsoft Visual C ++ 2015 Update 3.不幸的是,我无法使用其他编译器对此进行测试。
// The setup code for the two vectors:
vector<unique_ptr<channel>> channels, added_channels;
// ... here is some code that adds some elements to both vectors
根据我的知识,以下两段代码应该以相同的方式工作。他们应该将added_channels
的元素移到channels
的末尾。
这是崩溃的第一个变种:
std::move(added_channels.begin(), added_channels.end(), channels.end());
这是第二个有效的版本:
for(auto & ref : added_channels)
{
channels.push_back(std::move(ref));
}
答案 0 :(得分:12)
std :: move移动到特定位置 如果要将其插入向量的背面,则应使用std::back_inserter
std::move(added_channels.begin(), added_channels.end(), std::back_inserter(channels));
答案 1 :(得分:4)
这实际上是move_iterator
实际上有用的少数情况之一:
channels.insert(channels.end(),
std::make_move_iterator(added_channels.begin()),
std::make_move_iterator(added_channels.end()));
要插入vector
,范围insert
优先于逐个元素push_back
(或等效的back_inserter
),因为它可以避免不必要的重新分配并正确增长存储呈指数级增长。后者容易搞乱:reserve
的不加选择使用很容易导致二次行为。