我有:
class Foo {
std::vector<Thing>things;
void bar();
}
我需要修改存储在条形码中的东西:
void bar(){
//How do I read a Thing stored in the vector, without making a copy?
Thing thing = things[0]; // Doesn't this make a copy ?
//.....
}
如何在不制作副本的情况下读取存储在矢量中的东西?如果我这样做:
Thing &thing = things[0];
事物的成员没有初始化。
答案 0 :(得分:3)
第二个片段是点亮的:下面的行不会复制。
Thing &thing = things[0];
您的代码还有其他问题,可能是复制构造函数。由于thing
变量是对向量内对象的引用,如果您看到thing
已部分初始化,则向量内的对象也会被部分初始化。
要解决此问题,请确保您的代码具有正确的复制构造函数,并遵循rule of three。
但是,如果我使用引用,为什么还需要复制构造函数?
由于向量包含对象而不是指针,因此在将对象插入vector<Thing>
时会调用复制构造函数。如果复制构造函数是必需的,因为构造函数分配了资源但未提供,则在调用插入vector
的对象的析构函数时,对象可能会部分初始化。
答案 1 :(得分:0)
您可以使用指针。
Thing *thing = &things[0];
thing->pong();
如果未初始化,则vector
尚未就绪。
答案 2 :(得分:0)
您可以使用iterator
:
vector<Thing>::iterator iter = things.begin();
//then use iter as a pointer;
*iter = Thing();