即使在研究了examples之后,我也无法弄清楚如何使用MultiIndex容器上的复合键来提取范围。
typedef multi_index_container<
boost::shared_ptr< Host >,
indexed_by<
hashed_unique< const_mem_fun<Host,int,&Host::getID> >, // ID index
ordered_non_unique< const_mem_fun<Host,int,&Host::getAgeInY> >, // Age index
ordered_non_unique< const_mem_fun<Host,int,&Host::getHousehold> >, // Household index
ordered_non_unique< // Age & eligibility status index
composite_key<
Host,
const_mem_fun<Host,int,&Host::getAgeInY>,
const_mem_fun<Host,bool,&Host::isPaired>
>
>
> // end indexed_by
> HostContainer;
我的目标是让迭代器指向HostContainer hmap
中具有年龄partnerAge
并将false
返回Host::isPaired()
的第一个元素子集:
std::pair< hmap::iterator,hmap::iterator > pit = hmap.equal_range(boost::make_tuple( partnerAge, false ) );
我认为这是非常错误的。
std::pair
中的两个迭代器究竟是什么? (我正在从一个我不理解的例子中复制语法。)
std::count
来计算符合条件的年龄partnerAge
元素的数量(返回false
到Host::isPaired()
)。提取满足这些要求的排序索引的语法是什么?
我显然还在学习C ++语法。提前感谢您的帮助。
答案 0 :(得分:4)
要访问第N个索引,您可以使用函数get
,如下所示:
std::pair< hmap::nth_index<3>::type::const_iterator,
hmap::nth_index<3>::type::const_iterator > pit =
hmap.get<3>().equal_range(boost::make_tuple( partnerAge, false ) );
equal_range
返回第N个索引的迭代器对。由于复合键不是唯一的,因此您将获得满足指定条件的元素范围。要遍历该范围,您可以使用从第一个迭代器到第二个迭代器的循环。
考虑使用命名索引将它们用作get<index_name>()
,因为指定实际数字的可读性不高。
count
的语法类似于equal_range
:
size_t cnt = hmap.get<3>().count(boost::make_tuple( partnerAge, false ) );