如何在c ++中检索向量内的对象

时间:2012-01-11 15:04:17

标签: c++ pointers vector reference

我是C ++ noob程序员......(我通常使用Java)现在我遇到了指针,引用和向量方面的一些问题......

我需要从Object中提取vector<Object> objects并且为了简单起见,我想将他的引用存储在另一个对象中,因为我需要编辑其中的一些参数次

这是我到目前为止编写的代码:

Object myObject = getMyObject(id, objects); 

getMyObject只是实现for周期,找到右object的权利id,然后返回return objects[i]

但如果我理解正确,这个方法会复制对象!所以,在myObject中有一个完全不同的Object,是不是?

我该怎么办?

非常感谢!

5 个答案:

答案 0 :(得分:3)

是的,您需要使用指针或引用,否则您显示的行将调用Object的复制构造函数。

您可以getMyObject返回Object*,然后您有一个指向该对象的指针,您可以将其指定给另一个Object*

或者,将myObject定义为参考:Object& myObject

无论如何,您必须确保您返回的对象是动态分配的,而不是getMyObject()中的本地变量,否则您将获得访问冲突。

您还必须确保释放对象以防止内存泄漏。

答案 1 :(得分:2)

如果您不想复制该对象,则需要一个引用或指针。这个问题是引用或指针很容易变得无效。如果您不希望这种情况发生,那么您应该在向量中存储指针。特别针对这种情况,您很可能需要shared_ptr。

std::shared_ptr<Object> getMyObject(foo id,
    const std::vector<std::shared_ptr<Object>> & objects)
{
    // ... find object
    ...
    return objects[i];
}
...
std::vector<std::shared_ptr<Object>> objects;
objects.emplace_back(new Object(parameters));
...
std::shared_ptr<Object> x = getMyObject(id, objects);

答案 2 :(得分:1)

你是对的。你应该做的是让get函数返回一个引用:

Object & getMyObject(int id, std::vector<Object> & objects)
{
    // ... find ...
    return objects[i];
}

然后将其绑定到用户代码中的另一个引用:

Object & theobject = getMyObject(12, all_objects);

现在您可以通过引用theobject直接修改包含的元素。

如果您不想/需要修改对象,只需检查它们,您应该制作引用(以及容器)const

Object const & getMyObject(int id, std::vector<Object> const & objects);

答案 3 :(得分:1)

请记住,除非另有说明,否则STL始终会复制。但是,vector的at()和operator []都返回一个引用。

你需要

Object& myObject = objects.at(id);

如果要更改集合内的对象。

Object myObject = objects.at(id);

会给你一份副本。

答案 4 :(得分:0)

存储指向容器中原始对象的指针。

Object* obj1 = new Object();
Object* obj2 = new Object();

vector<Object*> myVector;
myVector.push_back(obj1);
myVector.push_back(obj2);

Object* tmpObj = myVector.at(0);