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;