【问题标题】:find() problems with boost bimapboost bimap 的 find() 问题
【发布时间】:2012-02-04 11:36:54
【问题描述】:

我有以下代码:

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 功能?

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

【问题讨论】:

    标签: c++ boost bimap


    【解决方案1】:

    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&lt;pair&gt;
    • vector_of(随机访问)-->vector_map(std::vector&lt;pair&gt;
    • unconstrained_set_of --> 未映射

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

    就您而言,您想要的是unordered_set_of。您需要为wxColour 定义自己的哈希函子。可以使用Boost.Hash来实现。

    最好的问候

    【讨论】:

    • 谢谢!你的回答很好,所以即使我选择了另一种解决方案,我也支持你。
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多