Доступ к значению с ключом в 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;

>
ошибка: ‘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});

1

Решение

Документация уже содержит все, что вам нужно для диагностики проблемы.

Прежде всего, обратите внимание, что тип вашего правильного взгляда 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Это того не стоит.

2

Другие решения

Других решений пока нет …