std::set
(またはstd::map
など)が固有のキーを識別する方法を理解している問題があります。私がやろうとしています事はboost::shared_ptr
内構造体オブジェクトをラップして、std::set
コンテナ内のポインタを共有ストアです: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
コンテナが2つのオブジェクトに対して比較関数を実行し、それらのどれもが他のものよりも大きくない、あるいはそれ以下でない場合、それらが等しいとみなすと考えました。ポインタのアドレスに基づいて実装されているので、私はデフォルトのshared_ptr::operator<()
とless<...>
を使用できないことに注意してください。
私には何が欠けていますか?
P.S.私はshared_ptr
の中に色をラッピングしています。ある時点で参照カウントを知る必要があります(そして、参照カウント1の色を取り除く必要があります。すなわち、std::set
コンテナ自体によって参照されるだけです)。同じ結果を得るより良い方法はありますか?
'weak_ptr'を保存し、' expired() 'であれば削除することができます。 – Xeo
しかし、 'weak_ptr'だけが' shared_ptr'を監視しているわけではありませんか?だから私はまだいくつかの時点で 'shared_ptr'を保存したり、譲り渡したりする必要があります。提案thoをありがとう。 – Sim
'weak_ptr :: lock'は新しい' shared_ptr'を作成します。 –
Xeo