[英]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.