Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在bimap中找到重复元素的所有键_C++_Boost_Boost Bimap - Fatal编程技术网

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

C++ 在bimap中找到重复元素的所有键,c++,boost,boost-bimap,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::b

我想访问
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
名称空间bimaps=boost::bimaps;
typedef boost::bimap bimap_参考;
typedef bimap_reference::value_type位置;
bimap_参考编号;
int main()
{
数字。插入(位置(123456100000));
数字。插入(位置(234567,80000));
数字。插入(位置(345678100000));
数字。插入(位置(456789,80000));
auto it=number.right.find(100000);
标准::不能在右侧使用

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

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)
{
        ...
}
使用ritr=bimap\u reference::right\u const\u迭代器;
标准::配对范围=数字。右。相等范围(100000);
用于(自动itr=range.first;itr!=range.second;++itr)
{
...
}

编辑:

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

与在std::pair声明中两次键入实际类型名相比,别名使下一行更易于阅读

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

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

在右侧使用

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

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)
{
        ...
}
使用ritr=bimap\u reference::right\u const\u迭代器;
标准::配对范围=数字。右。相等范围(100000);
用于(自动itr=range.first;itr!=range.second;++itr)
{
...
}

编辑:

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

与在std::pair声明中两次键入实际类型名相比,别名使下一行更易于阅读

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


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

谢谢您的回答,但它只给出了第一个位置。我应该得到both
100000
i,e
123456 100000
345678100000
的键,在上面的代码中,我只得到
123456 100000
,这是第一个位置。不,你的在线代码示例没有重复项。你有一个输入错误。修复输入错误,你会看到它给出了两个位置。实际上,我想确定nt在那里。如果元素不在那里,那么范围将指向我尝试的
bimap
的末尾
If(auto itr!=numbers.right.end()){……}else{……..}
,但
错误:在auto
之前预期的主表达式将丢失
auto
。您不希望在
if
语句中出现这种情况,这是一个语法错误。只需使用
if(itr!=numbers.right.end())
谢谢你的回答,但它只给出了第一个位置。我应该得到
100000
I,e
123456100000
345678100000
的两个键,在上面的代码中,我只得到
123456100000
,这是第一个位置。不,你的在线代码示例没有重复项。你有一个输入错误。请修复错误ypo,你会看到它给出了两个位置。实际上我想确定元素是否在那里。如果元素不在那里,那么范围将指向我尝试的
bimap
的末尾
,但
错误:在auto
之前预期的主表达式将丢失
auto
。您不希望在
if
语句中出现这种情况,这是一个语法错误。只需使用
if(itr!=numbers.right.end())