C++ boost::shared_ptr的内容作为set的键?

C++ boost::shared_ptr的内容作为set的键?,c++,boost,set,C++,Boost,Set,我想在std::unordered\u集合中存储一系列指针。我希望哈希函数不是基于内存地址,而是基于指针引用的实际对象中包含的一些值 e、 g.(使用std和boost名称空间以提高可读性) class-MyClass{ ... //我想用一些值作为散列的键 双a; int b; INTC; } typedef共享\u ptr MyClassPtr; 设置mySet; 我不担心组合实际的散列值(在这里找到答案:),而是去引用共享的\u ptr来获取密钥 我担心的另一个问题是,==操作符已经为b

我想在
std::unordered\u集合中存储一系列指针。我希望哈希函数不是基于内存地址,而是基于指针引用的实际对象中包含的一些值

e、 g.(
使用std
boost
名称空间以提高可读性)

class-MyClass{
...
//我想用一些值作为散列的键
双a;
int b;
INTC;
}
typedef共享\u ptr MyClassPtr;
设置mySet;
我不担心组合实际的散列值(在这里找到答案:),而是去引用
共享的\u ptr
来获取密钥

我担心的另一个问题是,
==操作符已经为
boost::shared\u ptr
定义了,我想知道这是否会导致我的方法出现问题?我需要测试对象的相等性,而不是指针

在集合中存储指针,因为代码的其他几个部分通过自己的指针引用对象。也欢迎任何替代方法


谢谢

有什么问题吗?定义散列函数和等式,然后继续:

struct MyClassHash
{
  inline std::size_t operator()(const MyClassPtr & p)
  {
    return 4;  //  prone to hash collisions, improve on this
  }
};

struct MyClassEqual
{
  inline bool operator()(const MyClassPtr & p, const MyClassPtr & q)
  {
    return false; // implement
  }
};

typedef std::unordered_set<MyClassPtr, MyClassHash, MyClassEqual> MySet;
struct MyClassHash
{
内联std::size\u t运算符()(常量MyClassPtr&p)
{
return 4;//容易发生哈希冲突,对此进行改进
}
};
结构MyClassEqual
{
内联布尔运算符()(常量MyClassPtr&p,常量MyClassPtr&q)
{
返回false;//实现
}
};
typedef std::无序设置MySet;
请注意,这两个函子(散列和相等)必须作为类编写;自由函数不起作用。(容器中保留了一个函子的私有实例。)这有点烦人,但既然你只做一次,那就不会那么糟糕了


通常我会建议专门化
std::hash
std::equals
,但我不太愿意使用共享指针这样的通用工具,因为它可能会很容易混淆其他不期望这些专门化的人。

你是说
无序集
std::set
使用严格的弱排序,而不是散列值。
//如果容易发生散列冲突,请对此进行改进。(尽管如此!)为什么不使用功能<代码>类型定义标准::无序设置MySet;MySet m(42,&my_hash_func,&my_pred_func)@dalle:嗯,我想我试过了,但没能成功。。。在任何情况下,这意味着函子不是默认可构造的,您必须始终保持那个笨重的构造函数。对于空基优化,基于类的方法应该不会更糟。我同意,由于内联等原因,基于函子的方法可能会更快,@dalle,更不用说函数方法几乎不可读了。
struct MyClassHash
{
  inline std::size_t operator()(const MyClassPtr & p)
  {
    return 4;  //  prone to hash collisions, improve on this
  }
};

struct MyClassEqual
{
  inline bool operator()(const MyClassPtr & p, const MyClassPtr & q)
  {
    return false; // implement
  }
};

typedef std::unordered_set<MyClassPtr, MyClassHash, MyClassEqual> MySet;