1

我有以下代码:

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;

我不断收到一个很长的模板错误,基本上说 find 函数不存在。然而

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

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

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

4

1 回答 1

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--> 未映射

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

在你的情况下,你想要的是一个unordered_set_of. 您需要为wxColour. 您可以使用 Boost.Hash 来实现它。

此致

于 2012-02-06T09:42:02.293 回答