【问题标题】:How to sort massive map by one value property?如何按一个值属性对海量地图进行排序?
【发布时间】:2012-01-29 21:53:40
【问题描述】:

我有一个 map<std::string, myStruct> 我想知道如何通过 myStruct.order 中的 int 属性对 map 中的项目进行排序,如果 myStruct 中的 2 个或更多订单是相同的键(字符串)抛出列表,这些键(字符串)使映射无法排序myStruct 的那个字段?在 C++03 中有什么花哨的方法(可能是 boost)?

【问题讨论】:

  • 翻转地图并将其设为map<myStruct, std::string>,您将免费获得此行为(前提是您为班级配备了比较运算符)。

标签: c++ sorting boost map


【解决方案1】:

boost 在MultiIndex 中具有完整(且复杂)的功能,但如果我了解您的要求,那么在这种情况下就有点过头了。一种相当简单的方法是构建指向 myStruct 的指针列表并进行排序。然后您可以轻松检查重复的键(这些键成为相邻的)。

排序应该使用less<const myStruct*>类型的函子,即

bool compare_orders(const myStruct* a, const myStruct* b) { return a->order < b->order; }

【讨论】:

    【解决方案2】:

    “排序”地图有什么意义?当然,地图可能在内部组织为 BST 或其他东西以加快访问速度,但从概念上讲,地图的元素并没有特定的顺序。

    除此之外,您可以为键提供排序方法(因为即使您确实以特定方式组织地图,它也是按键的顺序,而不是按值的顺序),但不是map 的第三个模板参数的值。

    【讨论】:

    • 这是不正确的,std::map 根据定义是一个排序的数据结构,即使在概念上也是如此。 std::unordered_map 是概念上未排序映射的一个示例。
    【解决方案3】:

    您不能这样做,使用 std::map - pair 中的 first 用于比较(称为 key)。在您的情况下,std::string

    您可以使用std::set&lt; std::pair&lt; std::string, MyStruct &gt; &gt;,然后为两个std::pair&lt; std::string, MyStruct &gt;-s 实现operator&lt;

    或者,如果可能/允许/合适/等,您可以更改std::map 的定义。这真的取决于你想要做什么以及你被允许做什么。

    或其他一些容器(保持元素的顺序,如插入 - 如std::liststd::vector 等),然后使用std::sort 或容器的sort 方法(如果存在)。

    【讨论】:

      【解决方案4】:

      我同意其他答案,即不清楚为什么需要对地图进行排序。但是您可以使用 双向映射 让您将 myStruct 和 string 都视为键。

      boost 有一个:

      http://www.boost.org/doc/libs/1_48_0/libs/bimap/doc/html/index.html

      这里有一个例子

      http://www.boost.org/doc/libs/1_48_0/libs/bimap/doc/html/boost_bimap/examples/simple_bimap.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2023-04-03
        • 1970-01-01
        • 2021-07-20
        相关资源
        最近更新 更多