如何在不制作副本的情况下从矢量中读取值?

时间:2015-06-27 10:12:25

标签: c++

我有:

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];

事物的成员没有初始化。

3 个答案:

答案 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();