C++ 使用复合_键和按位与比较增强多_索引_容器

C++ 使用复合_键和按位与比较增强多_索引_容器,c++,boost,multi-index,boost-multi-index,C++,Boost,Multi Index,Boost Multi Index,我想通过boost multi_index_容器和composite_键实现如下功能: 目标是能够执行以下操作: 这将允许我检索LogicalAnd返回true的所有元素 问题是我无法让我的LogicalAnd comparator与我的多索引容器一起工作。 我可以通过在composite_key_equal_之前添加一个composite_key_散列来构建它: composite\u key\u散列< boost::hash, boost::散列 > 但是find操作并没有像预

我想通过boost multi_index_容器和composite_键实现如下功能:

目标是能够执行以下操作:

这将允许我检索LogicalAnd返回true的所有元素

问题是我无法让我的LogicalAnd comparator与我的多索引容器一起工作。

我可以通过在composite_key_equal_之前添加一个composite_key_散列来构建它:

composite\u key\u散列<
boost::hash,
boost::散列
>
但是find操作并没有像预期的那样工作,所以它没有太大的变化

我搜索了boost文档,尝试了各种实现,但是我被大量的信息淹没了

感谢您的帮助

您正在对多重索引使用哈希

这意味着除非在正确的hash bucket中找到某些内容,否则永远不会调用
LogicalAnd
比较器

0x01
0xFF
即使
0x01&0xFF==0x01
也不会散列到相同的值。也就是说,
LogicalAnd
将返回true,但它从未被调用

您需要一个wrt不变的哈希函数<代码>逻辑和,我认为这是不可能的。通过设计,大多数散列函数都应该最小化不同键值之间的冲突


恐怕你需要想出一些不同的索引系统。

如果有帮助,这里有一个测试程序:至少有人有想法吗?:)至少还在寻找线索?你还没有真正说明问题所在。您会得到什么构建错误?
find
如何不按预期工作?您好,我在上面链接了一个测试程序。如前所述,只要我指定一个
复合密钥\u散列
,我就不会得到任何生成错误,但我希望find返回一个与我的
LogicalAnd::operator
匹配的项。不幸的是,正如链接的代码所示,它不起作用,因为
find
不返回任何条目。再次感谢您的帮助,现在您已经解释了它,它听起来很符合逻辑!但接着我又提出了第二个问题:什么样的索引系统可以帮助我实现这个目标?你有什么想法吗?你的两个问题都没有清楚地解释你的目标是什么,它们只是展示了一些无法实现目标的代码。在programmers.stackexchange上解释您的实际问题可能值得一试。对于允许您想要的查找类型的结构,您可以尝试Trie。
struct LogicalAnd {
    bool operator()(const int& argVal1, const int& argVal2) const {
        return int(argVal1 & argVal2) == argVal1;
    }
};

template<class T, class Enable = void>
class FooContainer;

template <class T>
struct FooContainer<T,typename boost::enable_if<boost::is_base_of<IFoo, T> >::type> {
    typedef multi_index_container<
            boost::shared_ptr<T>,
            indexed_by<
            hashed_non_unique<
            composite_key<
            T,
            const_mem_fun<T,int,&T::getKey1>,
            const_mem_fun<T,int,&T::getKey2>
    >,
    composite_key_equal_to<
    LogicalAnd,
    LogicalAnd
    >
    >
    >
    > shared_ptr_type;
};
namespace CustomKey {
    typedef enum {
        VAL1 = 0x00000001,
        VAL2 = 0x00000002,
        ALL = 0xFFFFFFFF
    } type;
}
container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));
composite_key_hash<
      boost::hash<int>,
      boost::hash<int>
>