2017-01-25 3 views
1

Я пытаюсь получить значение, доступное по его ключу. У меня есть минимальный пример, который я пробовал до сих пор, и отлично работает только для доступа с левой стороны.Значение доступа с ключом в 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}); 

ответ

2

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

Прежде всего, обратите внимание, что типа вашего собственного вида - multiset_of.
Как вы можете видеть, эквивалентный контейнер here, 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, это не стоит.

+0

Спасибо за ваш ответ. На самом деле я хотел использовать '.at()' для быстрого доступа. Использование. 'find() 'может быть не таким быстрым, потому что' bimap' слишком велико. И если я не могу выполнить поиск с половинным параметром, он удваивает работу, потому что моя работа выполняется с половинным поиском. Не могли бы вы предложить структуры данных, которые имеют такой тип функциональности, действительно быстро. – AwaitedOne

+0

Добавлен более подробный ответ. Мои два цента: если вы хотите пойти с 'multiset_of', используйте' find', если вы не можете продемонстрировать, что производительность плохо для вас. При этом вы не можете использовать 'at' с' multiset_of', у него нет этой функции-члена. Это не вопрос предпочтений. – skypjack

 Смежные вопросы

  • Нет связанных вопросов^_^