найти () проблемы с BIMAP Boost - PullRequest
       44

найти () проблемы с BIMAP Boost

1 голос
/ 04 февраля 2012

У меня есть следующий код:

wxString getColorName(const wxColour& color)
{
    typedef ColorComboBox::ColorMap::right_const_iterator ConstColorIterator;
    ColorComboBox::ColorMap colorMap = ColorComboBox::getDefaultChoices();
    ConstColorIterator it = colorMap.right.find(color);
    return it != colorMap.right.end() ? it->second :
            ColorComboBox::CUSTOM_COLOR;
}

где ColorMap определен

typedef boost::bimaps::bimap \
            <wxString, boost::bimaps::vector_of<wxColour> > \
            ColorMap;

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

ColorMap::left_const_iterator it = choices_.left.find(GetValue());

компилируется нормально.
У меня есть догадка, что функция поиска определена только в определенных типах коллекции bimap.Я не могу использовать set_of wxColours, потому что wxColour не сопоставим.(Что бы это даже значило?) Я также попытался изменить тип коллекции на list_of, но это тоже не сработало.Весь смысл в использовании bimap заключался в том, чтобы я мог найти значения, идущие в любом направлении.Я использую не тот контейнер?Есть ли другой тип коллекции, который я могу использовать для wxColour, который позволит мне использовать функцию поиска?

РЕДАКТИРОВАТЬ: В итоге я создал свой собственный контейнерный класс.

1 Ответ

5 голосов
/ 06 февраля 2012

Bimap позволяет вам определять тип отображения каждой стороны.Если вашему приложению необходимо выполнить быстрый поиск, используйте сопоставления на основе map / multimap или unordered_map / unordered_multimap.Пожалуйста, прочитайте документацию и помните, что каждый вид карты моделируется после эквивалентных контейнеров STL, поэтому они имеют одинаковые ограничения и интерфейс:

  • set_of (упорядочено, уникально) -> std::map
  • multiset_of (заказано) -> std::multimap
  • unordered_set_of (уникальное хеширование) -> std::unordered_map
  • unordered_multiset_of (перемешивание)-> std::unordered_multimap
  • list_of (упорядочено) -> list_map (std::list<pair>)
  • vector_of (произвольный доступ) -> vector_map (std::vector<pair>)
  • unconstrained_set_of -> не отображается

Я не понимаю, почему вы выбрали vector_of<wxColour>, возможно, это было только потому, что set_of<wxColour> (по умолчанию) не скомпилировано... в этом случае, как вы заявили, вам нужно определить свой собственный оператор сравнения, чтобы указать bimap, как упорядочивать эти элементы.Отображение векторов и отображение списков предназначены для того, чтобы вы могли создавать двунаправленные карты, сохраняющие порядок вставки ваших отношений.

В вашем случае вы хотите получить unordered_set_of.Вам нужно определить свой собственный хеш-функтор для wxColour.Вы можете использовать Boost.Hash для его реализации.

С уважением

...