如何正确初始化C++;? 我对C++是相当新的,我试图创建一个对象的向量并初始化它的成员,但是有一点我不确定是否正确: vector<Card> cardStorage; for (int i = 0; i < 20; i++) { Card card; cardStorage.push_back(card); } 矢量存储; 对于(int i=0;i以避免不必要地将卡 s复制到矢量< /代码>中,但您也可以简单地做: vector<Card> cardStorage(20); 矢量存储(20);

如何正确初始化C++;? 我对C++是相当新的,我试图创建一个对象的向量并初始化它的成员,但是有一点我不确定是否正确: vector<Card> cardStorage; for (int i = 0; i < 20; i++) { Card card; cardStorage.push_back(card); } 矢量存储; 对于(int i=0;i以避免不必要地将卡 s复制到矢量< /代码>中,但您也可以简单地做: vector<Card> cardStorage(20); 矢量存储(20);,c++,C++,基本上,这是类Card的20个对象的向量,push_back接受类型Card&,通过引用传递。因此,我不确定这样做是否会产生一个包含20个不同卡片对象的向量,或者向量的所有20个成员都指向一个对象,这不是我想要的,因为我需要遍历这个向量来操作对象数据成员(我也绝对不想创建类卡片的20对象并将其推入向量,因为这显然是一种不好的做法)。在向量上向后推,如果参数是l值(带名称的对象),则复制传入的参数因此,循环执行后,cardStorage中保证有20个不同的Card对象,因为每个Card都被复制到向

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

向量上向后推
,如果参数是l值(带名称的对象),则复制传入的参数因此,循环执行后,
cardStorage
中保证有20个不同的
Card
对象,因为每个
Card
都被复制到
向量中

可以考虑使用<代码> EpStudioBuffe/Copy>以避免不必要地将<代码>卡<代码> s复制到<代码>矢量< /代码>中,但您也可以简单地做:

vector<Card> cardStorage(20);
矢量存储(20);

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

这很好。
push_back
获取常量引用(或重载中的右值引用),而向量包含类型为
Card
的对象。在这种情况下,您只需复制临时值


您甚至可以完全避免创建临时对象,并调用
emplace_back()
直接在
向量
缓冲区中创建新对象,或者如果它们都应该是默认构造的,请使用
.resize()
或采用所需大小的构造函数。

您的示例是正确的,但可能更有效。 在运行时初始化向量的最有效方法如下(从C++17开始)

矢量存储;
//为所有对象分配内存
信用卡存储。储备(20);
对于(int i=0;i<20;i++){
//在位构造对象并返回对该对象的引用
//这样你就可以用卡片做smth了
auto&card=cardStorage.emplace_back(/*参数,如果需要*/);
}

push_back
为左值参数创建一个副本。右值将被移动(从C++11开始,当然,如果支持移动的话)。最好使用
cardStorage.push_back(std::move(card))
在OP的情况下。@DanielLangr添加了该选项,但对于OP的情况,使用合适的构造函数似乎最合适。取决于使用情况;指针比对象便宜,但如果对象小,那么就没问题。此外,正确使用指针可能会很棘手,因此如果不想存储对象,请选择
vector
“直接”。@cigien:如果指针实际上指向对象,这并不便宜。你仍然在为对象本身付费,加上分配器开销/对齐浪费,再加上指针本身。@Eddymage+:如果你需要复制
向量
,指针会更便宜,但是你需要使用
共享的\u ptr
或风险非托管指针(绝对是地狱)。在实践中,如果需要将
向量
传递给函数,最便宜的解决方案是让函数通过(通常是
常量
)引用接受整个
向量
;如果函数打算拥有
向量
,则通过r值引用传递它(对命名变量使用
std::move
)这两种方法都降低了将其传递到低固定成本的成本,无论是<代码>向量<代码>大小,W/O依赖指针的<代码>向量< /代码>。如果大小已知,并且固定,他应该使用<代码> STD::数组< /C> >。除此之外,我将要做的。代码中没有指针,C++不会悄悄地加入。C++中的“默认”行为是复制对象,但初学者似乎常常难以相信这一点。
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*/); 
}