繁体   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