使用std :: vector :: assign()将向量的一部分分配给自身

时间:2016-03-31 16:14:19

标签: c++ vector stl

让我说我有一个大小为10的向量(v1)。现在我只想保留部分元素,使用:
    v1.assign(v1.begin() + 2, v1.begin() + 6);

我不确定的是,原始元素在分配之前是否会被销毁。如果他们先被摧毁,那么我就不能依赖原始数据了。

page似乎表明首先删除了元素。但是,快速实验告诉我数据已正确分配给自己。

那么在将一部分向量分配给自身时会发生什么?

2 个答案:

答案 0 :(得分:4)

根据C ++ 14标准表100 - 序列容器要求(除了 容器)

表达式a.assign(i,j)具有ij不是迭代器的前提条件。由于

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 LindleyBarry的评论所指出,我们可以使用std::copymove 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将是无效的迭代器。