2012-11-20 87 views
1

我剛剛問了一個涉及std::set的問題,但考慮一下後,我想我已經將我的問題縮小到了一個簡單的問題。確定設置項目

我有一組獨特的物品。我想創建一個矢量,矢量中的每個元素指向集合中的一個項目。

所以,我有一組(唯一)甲對象:

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)); 

我想這也許不是個好主意,但。有沒有其他方法可以讓矢量元素指向集合中的特定對象?

+0

只有在刪除指向它的項時,迭代器纔會失效。因此,爲什麼不只是存儲迭代器呢?但是爲什麼你需要一組指針/迭代器/無論怎樣進入一個集合呢?這並不是說沒有可能用於這樣的事情,只是想知道。 –

+0

你可能想看看Intrusive Containers,就像Boost:http://www.boost.org/doc/libs/1_52_0/doc/html/intrusive.html - 這些讓你有你的蛋糕和吃鬆餅 – sehe

+0

@JerryCoffin我的一部分混亂不知道迭代器是否會失效或者如果我添加/刪除了其他設置項或者它在程序持續時間內是否會保持良好狀態,則會發生更改。 – user974967

回答

1

I'm thinking that might not be a great idea,你爲什麼這麼認爲?我看到你唯一能做的就是沿着智能指針的行來使用某些東西,而不是一個簡單的指針來澄清所有權,並避免與它們一起出現的內存泄漏錯誤。

或者像傑瑞建議的那樣,迭代器更好!

0

如果我是你,我會在堆上分配對象,並將智能指針(例如shared_ptr)存儲在集合和向量中。

在我看來,這將大大降低內存或指針相關錯誤的可能性。它也將解耦這個集合和矢量的生命週期。

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沒有管理直接的實例。相反,您需要承擔責任,因爲您的setvector都指向相同的對象。