簡體   English   中英

用C ++構造向量

[英]Constructing Vectors in C++

我最近遇到了這個代碼,但不太明白發生了什么。

auto c = vector<int> {};

返回的向量構造函數是什么?

然后這段代碼:

c = vector<int> {1,2,3,4,5 };

第二個c是否位於與初始c不同的內存位置?

c重新初始化時,是否會調用析構函數?

我搜索了互聯網,但找不到上述代碼的任何示例。

以上是如何不同的

vector<int> c {};

在此先感謝您的幫助。

“正如jrd1所說,它是一個C ++ 11特性。

關鍵字auto基本上意味着讓編譯器“猜測”變量的類型。

所以c是常規vector<int>

返回的向量構造函數是什么?

vector<int> ; 並且編譯器從該構造函數調用中推導出變量c的類型,這意味着c將獲得類型vector<int> auto基本上只是保存你兩次輸入變量類型 - 無論如何已經在構造函數調用中給出了,你現在不必再次在變量名前面鍵入它,你可以使用auto代替。

第二個c是否位於與初始c不同的內存位置?

不,它是相同的載體; 但來自另一個臨時vector<int> (包含值1,2,3,4和5)的值通過operator=分配給c 這意味着, c本身( &c )的地址不會改變。 但是,它包含的數據(例如c.data()的結果)可能也可能會改變。

當c重新初始化時,是否會調用析構函數?

不是c的析構函數。 只有一個來自臨時。

'first c'是定義變量c(int的向量)的地方。

auto c = vector<int> {};

'second c'只是重新賦值c。 它不是一個新變量,因此c的內存地址不會改變,並且不會調用c的析構函數。

c = vector<int> {1,2,3,4,5 };

實際發生的是vector {1,2,3,4,5}創建了一個vector類型的臨時對象,它從初始化列表中初始化,值為1,2,3,4,5。 然后將此臨時對象傳遞給c的復制構造函數(或在C ++ 11中)移動構造函數,以便c用臨時對象中的值替換其當前值(如果有)。

c的析構函數在超出范圍之前不會被調用(例如,函數退出或定義它的控制塊{}退出)。

第一行和最后一行在功能上是等效的。

對於作業:

c = vector<int> {1,2,3,4,5 };

c不會被破壞或者之后被定位在新的存儲器操作中。 會發生的是,將使用5個值創建未命名的第二個向量,並使用vector::operator=將該vector::operator=的內容分配給c。 這將在C ++ 11中的移動操作方面發生。 之后臨時矢量將被銷毀並且它的析構函數被調用,但不是c的析構函數。

C ++ 11包含auto關鍵字,它為您執行Type Inference
它有助於簡化代碼。
例:

auto itr = vec.iterator(); // instead of vector<int>::iterator itr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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