我第一次尝试使用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;
我怎样才能完成之前提到的任务?
答案 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";