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