Доступ к значению с ключом в 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_:: нет, mpl _:: нет, 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 Это того не стоит.

Другие вопросы по тегам