Я пытаюсь получить значение, доступное по его ключу. У меня есть минимальный пример, который я пробовал до сих пор, и отлично работает только для доступа с левой стороны.
#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;
>
ошибка: ‘boost :: bimaps :: bimap, boost :: bimaps :: multiset_of>> :: right_map {известный класс boost :: bimaps :: views :: multimap_view, boost :: bimaps :: multiset_of>, mpl _ :: na , mpl _ :: na, mpl _ :: na>>} ‘не имеет члена с именем’ at ‘
auto itt = numbers.right.at ({100000,50000});
Вышеуказанные строки не работают. Я также хотел бы знать, возможно ли получить доступ, используя только один элемент парного ключа, например
auto itt = numbers.right.at({50000});
Документация уже содержит все, что вам нужно для диагностики проблемы.
Прежде всего, обратите внимание, что тип вашего правильного взгляда multiset_of
,
Как вы видете Вот, multiset_of
эквивалентный контейнер std::multimap
и последний не имеет функции-члена at
,
Из-за этого вы не можете вызвать at
на multiset_of
это то, что вы получаете при доступе к правильному виду карты через .right
,
Ошибка также довольно очевидна.
Ты можешь использовать find
чтобы получить итератор для объекта, который вы ищете:
auto itt = numbers.right.find(std::make_pair(100000,50000));
std::cout<<"from right: "<<itt->first.first <<std::endl;
Ну, проверяя это против .end()
вероятно, будет хорошей идеей.
И нет, вы не можете искать с половиной ключа в качестве параметра. Если вы хотите сделать что-то подобное, вам лучше использовать что-то вроде карты, где ключи — это первые элементы ваших пар, а значения — это списки этих пар или какая-то другая структура данных, которая хорошо подходит для вашей реальной проблемы.
Определенно (почти) невозможно с bimap
Это того не стоит.
Других решений пока нет …