C++ 如何通过向量/映射使用指向对象的多个指针

C++ 如何通过向量/映射使用指向对象的多个指针,c++,pointers,object,vector,stdmap,C++,Pointers,Object,Vector,Stdmap,我有一个关于使用多个指针指向一个对象的问题。 向量中有一个指针,地图中有另一个指针。 地图使用矢量来索引对象。示例代码: class Thing { public: int x = 1; }; Thing obj_Thing; std::vector<Thing*> v_Things; v_Things.push_back(&obj_Thing); std::map<int, Thing*> m_ThingMap; m_ThingsMap[v_T

我有一个关于使用多个指针指向一个对象的问题。 向量中有一个指针,地图中有另一个指针。 地图使用矢量来索引对象。示例代码:

class Thing
{
public:
    int x = 1;
};

Thing obj_Thing;

std::vector<Thing*> v_Things;

v_Things.push_back(&obj_Thing);

std::map<int, Thing*> m_ThingMap;

m_ThingsMap[v_Things[0]->x] = v_Things[0]; // crucial part
类的东西
{
公众:
int x=1;
};
事物对象事物;
向量v_事物;
v_东西。推回(&obj_东西);
std::map m_ThingMap;
m_ThingsMap[v_Things[0]>x]=v_Things[0];//要害
像这样互相分配指针是一种好的做法吗


向量和/或映射是否应该保留地址?或者我应该使用指向地图的指针吗?

这取决于你想做什么

然而,当您的项目增长时,尤其是当其他人参与时,您的方法可能会变得非常棘手

首先,这是:

m_ThingsMap[v_Things[0]->x] = v_Things(0);
应该是:

m_ThingsMap[v_Things[0]->x] = v_Things[0];
此外,在
std::vector
中存储原始指针是可能的,但需要特别小心,因为如果指针指向的对象过早释放,可能会导致指针悬空

为此,我建议您使用以下方法:

std::vector<std::weak_ptr<Thing>> v_Things;
std::向量v_事物;
如果您决定坚持这种方法(我的意思是,如果指针指向一个对象,而该对象是从另一个指针共享的指针)



如果我是你,我会重新设计我的方法,因为你的代码不够干净,更不用说你的逻辑了;人们需要一两分钟才能理解所有指针和共享位置的情况。

v_Things(0)
可能应该是
v_Things[0]
?和
v_东西。向后推(&obj_东西)
非常危险,因为它很容易创建悬空指针(
obj\u Thing
生命周期可能比vector和map的生命周期结束得更早),您可能希望存储
Thing*
而不是
std::shared\u ptr
,以确保对象不会过早释放(并表明它在两个独立的“事物”之间共享)修正了打字错误,谢谢。如果v_ThingsMap的所有成员不一定都在m_ThingsMap中,我还应该使用shared_ptr吗?为什么不使用
std::vector
std::map
?您是否需要拥有
Things
s的第三个对象?设计目标是让事件将向量中的选定元素插入到映射中以避免lOOP遍历整个向量(将非常大)。std::vector::iterator>的速度有多快?目前我对迭代器的知识有限。我知道:p-------