让我说我有一个大小为10的向量(v1)。现在我只想保留部分元素,使用:
v1.assign(v1.begin() + 2, v1.begin() + 6);
我不确定的是,原始元素在分配之前是否会被销毁。如果他们先被摧毁,那么我就不能依赖原始数据了。
这page似乎表明首先删除了元素。但是,快速实验告诉我数据已正确分配给自己。
那么在将一部分向量分配给自身时会发生什么?
答案 0 :(得分:4)
根据C ++ 14标准表100 - 序列容器要求(除了 容器)
表达式a.assign(i,j)
具有i
和j
不是迭代器的前提条件。由于
v1.assign(v1.begin() + 2, v1.begin() + 6);
使用迭代器为v1
的迭代器,因此违反了前提条件
如果要重置向量以包含子范围,则可以将这些元素复制到临时向量中,然后将该临时向量分配回主向量。这应该是一个移动操作(C ++ 11及更高版本),因此不会生成其他副本。
vector_name = std::vector<type_used_for_vector_name>(vector_name.begin() + 2, vector_name.begin() + 6);
正如Benjamin Lindley和Barry的评论所指出,我们可以使用std::copy
和move iterators之类的
std::copy(std::make_move_iterator(v.begin() + 2), std::make_move_iterator(v.begin() + 6),
std::make_move_iterator(v.begin()));
答案 1 :(得分:1)
来自C ++ 11标准:
23.3.6.2向量构造函数,复制和赋值
template <class InputIterator> void assign(InputIterator first, InputIterator last);
11效果:
erase(begin(), end()); insert(begin(), first, last);
换句话说,请勿使用:
v1.assign(v1.begin() + 2, v1.begin() + 6);
当调用insert
时,first
将是无效的迭代器。