1

我只是问了一个涉及的问题,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));   

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

4

3 回答 3

1

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

或者像 Jerry 建议的那样,迭代器更好!

于 2012-11-20T23:32:56.677 回答
0

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

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

于 2012-11-20T23:32:19.000 回答
0

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

 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 的实例。set相反,您对您的和vector所有人都指向相同的对象这一事实负责。

于 2012-11-20T23:34:59.650 回答