在bimap中找到重复元素的所有键

时间:2017-02-02 06:29:05

标签: c++ boost boost-bimap

我想访问bimap中重复元素的所有键。我在下面有一些示例代码

#include <string>
#include <iostream>
#include <utility>
#include <boost/bimap.hpp>
#include <boost/bimap/set_of.hpp>
#include <boost/bimap/multiset_of.hpp>

namespace bimaps = boost::bimaps;
typedef boost::bimap<bimaps::set_of<unsigned long int>,
        bimaps::multiset_of<unsigned long int > > bimap_reference;
typedef bimap_reference::value_type position;
bimap_reference numbers;

int main()
{
    numbers.insert(position(123456, 100000));
    numbers.insert(position(234567, 80000));
    numbers.insert(position(345678, 100000));
    numbers.insert(position(456789, 80000));


    auto it = numbers.right.find(100000);
    std::cout<<"numbers:"<<it->first<<"<->"<<it->second<<std::endl;
    return 0;
}

在上面的代码中,我在右侧重复了一些元素。上面的代码为我提供了元素100000的第一个键,i,e 123456 <--> 100000。但我还有一个元素100000的条目,如何访问重复元素的所有键(该元素可能多次出现,左侧有唯一键)。

1 个答案:

答案 0 :(得分:2)

在右侧使用multiset::equal_range

通过这种方式,您可以获得从第一次出现到最后一次迭代所需的迭代器范围。

using ritr = bimap_reference::right_const_iterator;

std::pair<ritr, ritr> range = numbers.right.equal_range(100000);

for (auto itr = range.first; itr != range.second; ++itr)
{
        ...
}

<小时/> 编辑:

using ritr语句使ritr成为实际类型的别名。它相当于你使用更高的typedef

别名只是使下一行更容易阅读,而不是在std :: pair声明中输入两次实际类型名称。

更简单的解决方案是使用自动。

equal_range是multimaet的成员函数,位于bimap的右侧。它返回一个std :: pair,它包含multiset中与指定键相等的元素的begin和end迭代器,让你以正常方式迭代。