[英]Does C++ vector copy constructor and assignment operator also copies reserved space?
復制構造函數被調用
vector<int> v0;
v0.reserve(3);
vector<int> v1 = v0;
v1 也會保留 3 的空間嗎?
賦值運算符被稱為
vector<int> v0;
v0.reserve(3);
vector<int> v1;
v1 = v0;
v1 也會保留 3 的空間嗎?
標准沒有說明復制后的額外預訂。 因此,保留空間是特定於實現的。 所以,你不應該在復制后依賴保留空間。
不。
你可以通過一個小例子來說服自己
std::vector<int> x(10);
x.reserve(20);
std::vector<int> y;
y = x;
std::cout << y.capacity();
在我的情況下,輸出為10
。
還要考慮到,通常y = x
的效果是 after (y == x) == true
,而==
不考慮保留空間:
std::vector<int> x;
std::vector<int> y;
x.reserve(10);
y.reserve(20);
std::cout << (x == y);
輸出
1
進一步考慮std::vector::operator==
具有復雜性( cppreference ):
1) 與 *this 和 other 的大小成線性關系。
如果分配后y
與x
具有相同的容量,則operator==
s 的復雜性將取決於容量而不僅僅是大小。
該標准規定,對於容器,制作副本要求std::equal(src.begin(), src.end(), copy.begin(), copy.end())
之后為真。 Vector 容器沒有額外的要求,所以src.capacity()
和copy.capacity()
是無關的。
我們可以推斷出一些額外的、隱含的要求。 例如, src.end()-src.begin() == copy.end()-copy.begin()
else std::equal
將返回 false,因此src.size()==copy.size()
但它們都與向量的元素有關,而不是容量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.