2012-02-04 47 views
1

我有以下代码:find()方法以提升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; 
} 

其中颜色表定义

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函数?

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

回答

4

Bimap允许您定义每边的mapping type。如果您的应用程序需要执行快速搜索,请使用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来实现它。

致以问候

+0

谢谢!你的回答很好,所以我提出了你的提议,即使我采用了另一种解决方案。 – Eva 2012-02-06 15:26:36