使用composite_key和按位和比较来提升multi_index_container

时间:2013-04-19 09:52:35

标签: c++ boost multi-index boost-multi-index

我希望通过boost multi_index_container和composite_key实现类似的功能:

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;
};

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;
}
目标是能够执行以下操作: namespace CustomKey { typedef enum { VAL1 = 0x00000001, VAL2 = 0x00000002, ALL = 0xFFFFFFFF } type; }

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

问题是我无法让我的LogicalAnd比较器与我的multi_index_container一起使用。

我可以通过在composite_key_equal_to之前添加一个composite_key_hash来构建它:

container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));

container.find(boost::make_tuple(CustomKey::VAL1, CustomKey::ALL));

查找操作无法按预期工作,因此不会发生太大变化......

我搜索了增强文档,我尝试了各种实现,但是我的信息量已经被淹没......

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您正在为多索引使用哈希

这意味着永远不会调用LogicalAnd比较器,除非在正确的哈希桶中找到了什么。

即使 0x01

0xFF0x01 & 0xFF == 0x01也不会哈希到相同的值。也就是说,LogicalAnd将返回true,但它永远不会被调用。

你需要一个不变的哈希函数。 LogicalAnd,我不认为这是可能的。根据设计,大多数散列函数应该最小化不同键值之间的冲突。

你需要提出一些不同的索引系统,我担心。