在boost :: multi_index

时间:2015-12-17 15:19:11

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

我第一次尝试使用boost的多索引时,我似乎无法绕过我在网络上看到的所有代码。< / p>

首先:我的目标是让一个带有枚举的容器作为直接访问的密钥,并且能够根据原始插入顺序对其进行迭代。

我已经定义了我的提升元素:

struct VarMapEle {
    SolutionVariableNames first;
    uint    second;
};

struct var_tag {};
struct rand_tag {};

typedef multi_index_container<
    VarMapEle,
    indexed_by< 
        random_access<tag<rand_tag>>, // this index represents insertion order
        hashed_unique<tag<var_tag>, member<VarMapEle, SolutionVariableNames,     &VarMapEle::first>>
        >
> VariableMap;

我怎样才能完成之前提到的任务?

1 个答案:

答案 0 :(得分:2)

multi_index_container可以被视为一堆容器(在您的示例中,一个std::vector - 如 - random_acces - 另一个类似于std::unordered_set } - hashed_unique - )恰好在同一个底层元素集合上行事。每个&#34;容器&#34;使用get<tag>()get<n>()访问索引,其中 n indexed_by中指定的索引的从0开始的顺序部分。因此,要按照插入顺序迭代元素,您需要访问索引#0并使用它,因为您使用std::vector

for(const VarMapEle& e:m.get<rand_tag>()){
    std::cout<<e.first<<","<<e.second<<"\n";
}

同样,查找工具由索引#1提供:

auto it=m.get<var_tag>().find(SolutionVariableNames{1});
std::cout<<it->second<<"\n";