使用 bimap 中的键访问值
Access value with key in 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<std::pair<unsigned long int, unsigned long int> > > bimap_reference;
typedef bimap_reference::value_type position;
bimap_reference numbers;
int main()
{
numbers.insert(position(123456, std::make_pair(100000,50000)));
numbers.insert(position(234567, std::make_pair(200000,80000)));
numbers.insert(position(345678, std::make_pair(300000,10000)));
numbers.insert(position(456789 ,std::make_pair(100000,60000)));
auto it = numbers.left.at(123456);
std::cout<<"numbers:"<<it.first<<"<->"<<it.second<<std::endl;
return 0;
}
当我尝试通过使用配对键访问值从右侧查看时,作为线索,我尝试了以下操作。
auto itt = numbers.right.at({100000,50000});
auto itt = numbers.right.at(std::make_pair(100000,50000));
std::cout<<"from right: "<<itt.first<<std::endl;
>
error: ‘boost::bimaps::bimap, boost::bimaps::multiset_of > >::right_map {aka class boost::bimaps::views::multimap_view, boost::bimaps::multiset_of >, mpl_::na, mpl_::na, mpl_::na> >}’ has no member named ‘at’
auto itt = numbers.right.at({100000,50000});
以上几行无效。我还想知道是否可以仅使用配对密钥的一个元素来访问
auto itt = numbers.right.at({50000});
文档已包含诊断问题所需的所有内容。
首先请注意,您右视图的类型是multiset_of
。
可以看到 here, multiset_of
's equivalent container is std::multimap
而后者没有成员函数 at
.
因此,您不能在 multiset_of
上调用 at
,这是通过 .right
.
访问地图的正确视图时得到的结果
错误确实也很清楚。
您可以使用 find
得到您正在寻找的对象的迭代器:
auto itt = numbers.right.find(std::make_pair(100000,50000));
std::cout<<"from right: "<<itt->first.first <<std::endl;
嗯,对照 .end()
检查它可能是个好主意。
不,您不能使用半键作为参数进行搜索。如果你想做这样的事情,你应该使用像地图这样的东西,其中键是你对的第一个元素,值是这些对的列表或其他一些非常适合你的实际问题的数据结构。
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<std::pair<unsigned long int, unsigned long int> > > bimap_reference;
typedef bimap_reference::value_type position;
bimap_reference numbers;
int main()
{
numbers.insert(position(123456, std::make_pair(100000,50000)));
numbers.insert(position(234567, std::make_pair(200000,80000)));
numbers.insert(position(345678, std::make_pair(300000,10000)));
numbers.insert(position(456789 ,std::make_pair(100000,60000)));
auto it = numbers.left.at(123456);
std::cout<<"numbers:"<<it.first<<"<->"<<it.second<<std::endl;
return 0;
}
当我尝试通过使用配对键访问值从右侧查看时,作为线索,我尝试了以下操作。
auto itt = numbers.right.at({100000,50000});
auto itt = numbers.right.at(std::make_pair(100000,50000));
std::cout<<"from right: "<<itt.first<<std::endl;
> error: ‘boost::bimaps::bimap, boost::bimaps::multiset_of > >::right_map {aka class boost::bimaps::views::multimap_view, boost::bimaps::multiset_of >, mpl_::na, mpl_::na, mpl_::na> >}’ has no member named ‘at’ auto itt = numbers.right.at({100000,50000});
以上几行无效。我还想知道是否可以仅使用配对密钥的一个元素来访问
auto itt = numbers.right.at({50000});
文档已包含诊断问题所需的所有内容。
首先请注意,您右视图的类型是multiset_of
。
可以看到 here, multiset_of
's equivalent container is std::multimap
而后者没有成员函数 at
.
因此,您不能在 multiset_of
上调用 at
,这是通过 .right
.
访问地图的正确视图时得到的结果
错误确实也很清楚。
您可以使用 find
得到您正在寻找的对象的迭代器:
auto itt = numbers.right.find(std::make_pair(100000,50000));
std::cout<<"from right: "<<itt->first.first <<std::endl;
嗯,对照 .end()
检查它可能是个好主意。
不,您不能使用半键作为参数进行搜索。如果你想做这样的事情,你应该使用像地图这样的东西,其中键是你对的第一个元素,值是这些对的列表或其他一些非常适合你的实际问题的数据结构。
bimap
绝对(几乎)不可行,不值得。