我有以下代码:

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());

编译良好。
我有一个预感,仅在某些bimap集合类型中定义了find函数。我无法使用set_of wxColours,因为wxColour不具有可比性。 (那甚至意味着什么?)我还尝试将集合类型更改为list_of,但这也不起作用。使用bimap的全部目的是使我可以找到任一种方式的值。我使用了错误的容器吗? wxColour是否可以使用其他收集类型,使我可以使用find函数?

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

最佳答案

Bimap允许您定义每侧的mapping type。如果您的应用程序需要执行快速搜索,请使用基于map / multimap或基于unordered_map / unordered_multimap的映射。请阅读文档,并记住每个 map View 均以等效的S​​TL容器为模型,因此它们共享相同的约束和接口(interface):

  • 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如何排序这些项目。 vector 映射和列表映射可以使您创建保留 map 插入顺序的双图。

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

    最好的祝福

    08-24 22:16