簡體   English   中英

如何正確初始化 C++ 中的對象向量?

[英]How to correctly initialize a vector of objects in C++?

我對 C++ 相當陌生,我正在嘗試創建一個 object 的向量並初始化它的成員,但是有一點我不確定我是否做得正確:

 vector<Card> cardStorage;
   for (int i = 0; i < 20; i++) {
         Card card;
         
         cardStorage.push_back(card);
     
     }

基本上這是 class 卡的 20 個 object 的向量,而 push_back 采用 Card & 類型,這是通過引用傳遞的。 因此,我不確定這樣做是否會產生一個包含 20 個不同 Card 對象的向量,或者該向量的所有 20 個成員都將指向一個 object,這不是我想要的,因為我需要遍歷這個向量來操作object 數據成員(我也絕對不想創建 class 卡的 20 個 object 並將其推入向量,因為這顯然是不好的做法)。

如果參數是左值(帶有名稱的 object),則vector上的push_back復制傳入的參數。 所以cardStorage保證在循環執行后有 20 個不同的Card對象,因為每個Card都被復制到vector中。

您可以考慮使用emplace_back來避免不必要地將Card復制到vector中,但您也可以簡單地執行以下操作:

vector<Card> cardStorage(20);

達到與所示代碼相同的效果。

沒關系。 雖然push_back采用 const 引用(或重載中的右值引用),但您的向量包含Card類型的對象。 在這種情況下,您只需復制臨時文件。

您甚至可以完全避免創建臨時對象並調用emplace_back()直接在vector緩沖區中創建新對象,或者如果它們都應該是默認構造的,請使用.resize()或采用所需的構造函數尺寸。

你的例子是正確的。 但它可能更有效。 在運行時初始化向量的最有效方法如下(C++17 起)。

vector<Card> cardStorage;
// allocates memory for all the objects
cardStorage.reserve(20); 
for (int i = 0; i < 20; i++) {
    // constructs the object in-place and returns the reference to that object 
    // so that you you can do smth with card
    auto &card = cardStorage.emplace_back(/*Arguments if needed*/); 
}

暫無
暫無

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

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