使用赋值运算符时分配免费的 std::vector 副本

Ped*_*dro 6 c++ stl c++11

当具有原始数据类型的两个实例std::vector具有相同的大小和容量时,是否可以保证通过复制赋值运算符进行复制不会重新分配目标向量?

例子:

const int n = 3;

std::vector<int> a, b;

// ensure defined capacity
a.reserve(n);
b.reserve(n);

// make same size
a.resize(n);
b.resize(n);

// set some values for a
for (int i = 0; i < n; i++)
{
    a[i] = i;
}

// copy a to b: allocation free?
b = a;
Run Code Online (Sandbox Code Playgroud)

我只发现“否则,*this 拥有的内存可能会在可能的情况下被重用。” (自 C++11 起)位于cppreference.com。我希望是“必须”而不是“可能”。

如果对于更一般的情况(例如“相同大小就足够了”)应该有一个肯定的答案,那就更好了。

如果没有保证,这种情况可能是复制 std::vector: 更喜欢赋值或 std::copy?的答案。,什么时候std::copy会首选。

ixS*_*Sci 6

标准不保证不会有分配。根据C++11 标准,效果b = a;就好像b.assign(a.begin(), a.end())(多余的 b 元素被销毁,如果有的话),其结果是“用 [a.begin(), a.end()) 的副本替换 b 中的元素”。没有关于分配的内容,但在C++20 标准(可能更早)中,我们有一个附加声明:“使引用 b 元素的所有引用、指针和迭代器无效”。这意味着分配是可能的,并且capacity()在这些保证中没有提到任何地方以防止在您的特定情况下进行分配。

另一方面,在实践中,如果内存已经足够了,为什么还要重新分配内存呢?