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