find()有关boost bimap的问题

Eva*_*Eva 1 c++ boost bimap

我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

其中定义了ColorMap

typedef boost::bimaps::bimap \
            <wxString, boost::bimaps::vector_of<wxColour> > \
            ColorMap;
Run Code Online (Sandbox Code Playgroud)

我一直得到一个很长的模板错误,基本上说找不到查找功能.然而

ColorMap::left_const_iterator it = choices_.left.find(GetValue());
Run Code Online (Sandbox Code Playgroud)

编译好.
我有一个预感,find函数只在某些集合类型的bimap中定义.我不能使用set_of wxColours,因为wxColour无法比较.(这甚至意味着什么?)我也尝试将集合类型更改为list_of,但这也不起作用.我使用bimap的全部意义在于,无论哪种方式,我都能找到价值观.我使用了错误的容器吗?是否有另一种我可以用于wxColour的集合类型,它允许我使用find函数?

编辑: 我最终创建了自己的容器类.

小智 6

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如何订购这些项目.矢量映射和列表映射允许您创建保持关系的插入顺序的bimaps.

在你的情况下,你想要的是一个unordered_set_of.您需要为其定义自己的哈希函子wxColour.您可以使用Boost.Hash来实现它.

最好的祝福