如何在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