find()有关boost bimap的问题

时间:2012-02-04 11:36:55

标签: 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;
}

定义了ColorMap

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

我不断得到一个长模板错误,基本上说找不到查找功能。然而

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

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

修改 我最终创建了自己的容器类。

1 个答案:

答案 0 :(得分:5)

Bimap允许您定义每一方的mapping type。如果您的应用程序需要执行快速搜索,请使用基于map / multimap或unordered_map / unordered_multimap的映射。请阅读文档并记住每个映射视图都是在等效的STL容器之后建模的,因此它们共享相同的约束和接口:

  • set_of(有序,唯一) - &gt; std::map
  • multiset_of(已订购) - &gt; std::multimap
  • unordered_set_of(哈希,独一无二) - &gt; std::unordered_map
  • unordered_multiset_of(哈希) - &gt; std::unordered_multimap
  • list_of(已排序) - &gt; list_map(std::list<pair>
  • vector_of(随机访问) - &gt; vector_map(std::vector<pair>
  • unconstrained_set_of - &gt;

我不明白为什么你选择vector_of<wxColour>,也许只是因为set_of<wxColour>(默认)没有编译...在这种情况下,如你所说,你需要定义你自己的比较运算符告诉bimap如何订购这些项目。矢量映射和列表映射允许您创建保持关系的插入顺序的bimaps。

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

祝你好运