我在理解std::set
(或std::map
等)如何標識唯一密鑰方面存在問題。我試圖做的事情是內boost::shared_ptr
,然後商店std::set
容器內共享指針換一個struct對象:std :: set和boost :: shared_ptr唯一密鑰標識問題
假設的結構是一個顏色:
struct Color {
float r;
float g;
float b;
};
然後將容器和比較函數對象在另一個類定義:
class AnotherClass {
typedef boost::shared_ptr<Color> ColorPtr;
public:
struct ColorCompare {
bool operator()(const ColorPtr &a, const ColorPtr &b) const {
return (a->r > b->r) && (a->g > b->g) && (a->b > b->b);
}
};
private:
// Container definition
std::set<ColorPtr, ColorCompare> colors;
};
上面的代碼不能唯一地識別基於它們包裹Color
結構shared_ptr
對象。我一直認爲std::set
容器會對兩個對象運行比較函數,如果它們中的任何一個都不大於或小於另一個 - 它會認爲它們是相等的。請注意,由於該實現基於指針地址,因此我不能使用默認的shared_ptr::operator<()
和less<...>
。
我錯過了什麼?
p.s.我在shared_ptr
之內包裝顏色,因爲我需要知道它們在某個點的引用計數(並刪除參考計數爲1的顏色 - 也就是說,只能由std::set
容器本身引用)。有沒有更好的方法來獲得相同的結果?
您可以存儲'weak_ptr'並將它們移除(如果它們是'expired()')。 – Xeo 2012-01-07 17:27:25
但是'weak_ptr'不是'shared_ptr'的觀察者嗎?所以我仍然需要在某個時刻存儲或放棄'shared_ptr'。感謝您的建議。 – Sim 2012-01-07 19:14:47
'weak_ptr :: lock'創建一個新的'shared_ptr'。 –
Xeo
2012-01-07 21:57:28