【问题标题】:Find all the keys of repeated element in bimap查找bimap中重复元素的所有键
【发布时间】:2017-02-02 06:29:04
【问题描述】:

我想访问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的第一个键,即123456 &lt;--&gt; 100000。但是我还有一个元素100000的条目,如何访问重复元素的所有键(该元素可能多次出现,左侧唯一键)。

【问题讨论】:

    标签: c++ boost boost-bimap


    【解决方案1】:

    在右侧使用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 声明中两次输入实际类型名称相比,别名只是使下一行更易于阅读。

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

    equal_range 是位于 bimap 右侧的 multiset 的成员函数。它返回一个 std::pair ,其中包含多重集中等于指定键的元素的开始和结束迭代器,以便您以正常方式进行迭代。

    【讨论】:

    • 感谢您的回答,但它只提供了第一个位置。 cpp.sh/8j74i
    • 我应该得到100000 的两个密钥,即123456&lt;--&gt; 100000345678&lt;--&gt;100000,在上面的代码中我只得到123456&lt;--&gt; 100000 这是第一个位置。
    • 不,您的在线代码示例没有重复项。你有一个错字。修正错字,你会看到它给出了两个位置。
    • 其实我想确定元素是否存在。如果元素不存在,则范围将指向 bimap 的末尾,因为我尝试了 if(auto itr != numbers.right.end()){....}else{...........},但 error: expected primary-expression before auto
    • 失去auto。您不希望在 if 语句中出现这种情况,这是语法错误。只要有if (itr != numbers.right.end())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多