我有以下代码:
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函数?
修改 我最终创建了自己的容器类。
答案 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来实现它。
祝你好运