簡體   English   中英

C++ 向量復制構造函數和賦值運算符是否也復制保留空間?

[英]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 的空間嗎?

標准沒有說明復制后的額外預訂。 因此,保留空間是特定於實現的。 所以,你不應該在復制后依賴保留空間。

標准對此沒有說明: http : //eel.is/c++draft/vector

它是特定於實現的。

例如, clang不會檢查初始向量中保留了多少容量,而只是根據元素的數量進行分配。

不。

你可以通過一個小例子來說服自己

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 的大小成線性關系。

如果分配后yx具有相同的容量,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM