當有兩個具有相同大小和容量的原始資料型別的實體時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;
我只發現“否則,*this 擁有的記憶體可能會在可能的情況下被重用。” (自 C 11 起)在cppreference.com上。我希望“必須”而不是“可能”。
如果對于更一般的情況(例如“相同大小就足夠了”)應該有一個肯定的答案,那就更好了。
如果不能保證,這種情況可能是Copying std::vector: prefer assignment or std::copy? , 什么時候std::copy會更受歡迎。
uj5u.com熱心網友回復:
標準不保證不會有分配。根據C 11 標準,效果b = a;就像b.assign(a.begin(), a.end())(如果有多余的 b 元素被破壞,如果有的話),結果是“用 [a.begin(), a.end()) 的副本替換 b 中的元素” . 與分配無關,但使用C 20 標準(可能更早),我們有一個附加宣告:“使所有參考 b 元素的參考、指標和迭代器無效”。這意味著分配是可能的,并且capacity()在這些保證中的任何地方都沒有提到在您的特定情況下防止它。
另一方面,在實踐中,如果記憶體已經足夠了,為什么還要重新分配記憶體呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480880.html
