提问者:小点点

如何在C++中正确初始化一个对象的向量?


我对C++相当陌生,正在尝试创建一个对象的向量并初始化它的成员,但有一个地方我不确定我做得是否正确:

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

基本上,这是一个向量的20个对象的类别卡片,和push_back采取类型卡片&,这是通过引用传递。 因此,我不确定这样做是否会产生一个由20个不同的Card对象组成的向量,或者向量的所有20个成员都指向一个对象,这不是我想要的,因为我需要遍历这个向量来操作对象数据成员(我也绝对不想创建Card类的20个对象并将其推入向量,因为这显然是糟糕的做法)。


共3个答案

匿名用户

向量上的push_back复制传入的参数,如果参数是L值(有名称的对象)。 因此,在执行循环后,保证CardStorage中有20个不同的Card对象,因为每个Card都被复制到Vector中。

您可以考虑使用emplace_back来避免不必要地将复制到向量中,但是您也可以简单地执行以下操作:

vector<Card> cardStorage(20);

它实现了与所示代码相同的效果。

匿名用户

没问题。 当push_back接受const-reference(或重载中的rvalue-reference)时,向量保存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*/); 
}

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(何在|c++|中|初始化|对象|向量)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?