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

Posted

技术标签:

【中文标题】如何在c ++中检索向量内的对象【英文标题】:how to retrieve an object inside a vector in c++ 【发布时间】:2012-01-11 15:04:16 【问题描述】:

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

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

这是我目前写的代码:

Object myObject = getMyObject(id, objects); 

getMyObject 只是实现了一个for 循环,该循环找到正确的object 和正确的id,并用return objects[i] 返回它

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

我该怎么办??

非常感谢!

【问题讨论】:

但是你说“我想将它存储在另一个对象中”......那么你有一个副本,对吗?您不能将对象存储在数组中,而同样的对象也存储在其他位置。 如果您知道您在指针、引用方面存在“问题”,那么为您的未来发展首先“解决这些问题”可能是一个好主意。这些概念在其他语言(如 Java)中也可能有用,以了解事物的工作原理。 是的......你说得对,我的意思是我想要访问那个确切的对象 @ereOn 我很着急,我很快就需要这个,一个例子是我学习的最佳方式! 【参考方案1】:

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

你可以让getMyObject返回Object*,然后你有一个指向对象的指针,你可以把它分配给另一个Object*

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

无论如何,您必须确保您返回的对象是动态分配的,而不是作为getMyObject() 中的局部变量,否则您将遇到访问冲突。

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

【讨论】:

@Janky:这是一个快速消除疑虑的好地方:parashift.com/c++-faq-lite/references.html。如果有时间,您应该阅读所有内容。【参考方案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);

【讨论】:

【参考方案3】:

你是对的。你应该做的是让 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);

【讨论】:

【参考方案4】:

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

你需要

Object& myObject = objects.at(id);

如果您想更改集合内的对象。

Object myObject = objects.at(id);

会给你一份。

【讨论】:

【参考方案5】:

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

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

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

Object* tmpObj = myVector.at(0);

【讨论】:

以上是关于如何在c ++中检索向量内的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ ATL/MFC 中检索具有相同格式的刻度,如 DateTime.Ticks

如何在对象文字中添加对象文字[重复]

如何在 C++ 中向向量中添加新对象

如何在 C++ 中打印对象向量?

如何在 QML Canvas 对象中检索 QPainter 对象

如何唯一存储在存储在向量中的对象中的数据?