标识设置项

identifying set items

本文关键字:设置 标识      更新时间:2023-10-16

我刚刚问了一个涉及std::set的问题,但在考虑了更多之后,我想我已经将问题缩小到简单的事情。

我有一套独特的物品。我想创建一个向量,其中向量中的每个元素都指向集合中的一个项目。

所以,我有一组(唯一的)A 对象:

class A
{
    int i;
};
std::set<A, compareclass> mySet;

和 A* 的向量:

std::vector<A*> myVec;

set::insert()返回一对,其中包含集合中元素(插入或已存在)的迭代器。从技术上讲,我可以像这样获得它的地址:

ret = myset.insert(A());
myVec.push_back(&(*ret.first));   

不过,我认为这可能不是一个好主意。有没有其他方法可以让向量元素指向集合中的特定对象?

I'm thinking that might not be a great idea,你为什么这么认为?我看到你的唯一一件事是,你可以做的是使用智能指针而不是普通指针来澄清所有权,并避免随之而来的内存泄漏错误。

或者像杰瑞建议的那样,迭代器甚至更好!

如果我

是你,我会在堆上分配对象,并存储智能指针(例如 shared_ptr )在集合和向量中。

在我看来,这将大大降低内存或指针相关错误的可能性。它还会将集合和向量的生存期解耦。

你有没有尝试过类似的东西

 typedef std::shared_ptr<A> APtr
 std::set<APtr, compareClassThatTakesAPtr> aSet;
 aSet.insert(new A());
 std::vector<APtr> aVec;
 //...
 aVec.push_back(aSet.begin());

现在它们在堆上,set/vector不直接管理 A 的实例。相反,你要对你的setvector都指向相同的对象这一事实负责。