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

vlu*_*rsk 4 c++ stl vector

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

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

页面似乎表明元素首先被删除。然而,快速实验告诉我,数据已正确分配给自身。

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

Nat*_*ica 5

根据 C++14 标准表 100 \xe2\x80\x94 序列容器要求(除\n容器外)

\n

该表达式a.assign(i,j)有一个前提条件,即ij不是 a 的迭代器。自从

\n
v1.assign(v1.begin() + 2, v1.begin() + 6);\n
Run Code Online (Sandbox Code Playgroud)\n

使用迭代器作为迭代器,v1因此您违反了该先决条件

\n

如果要重置向量以包含子范围,则可以将这些元素复制到临时向量中,然后将该临时向量分配回主向量。这应该是移动操作(C++11 及更高版本),因此不会创建额外的副本。

\n
v = std::vector<decltype(v)::value_type>(v.begin() + 2, v.begin() + 6);\n
Run Code Online (Sandbox Code Playgroud)\n

正如本杰明·林德利巴里的评论中指出的那样,我们可以使用std::copy移动迭代器,例如

\n
std::copy(std::make_move_iterator(v.begin() + 2), std::make_move_iterator(v.begin() + 6), \n          std::make_move_iterator(v.begin()));\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我认为将向量复制到自身并删除无关元素会更有效。无需分配。`std::copy(v.begin() + 2, v.begin() + 6, v.begin()); v.调整大小(6 - 2);` (3认同)