【问题标题】:sorting std::map by value按值排序 std::map
【发布时间】:2019-05-03 17:12:43
【问题描述】:

现在我有一张地图,我需要按 value(int) 对其进行排序,如果有平局,则按 key(string) 对其进行排序。我知道我需要为此编写一个自定义的比较函数,但是到目前为止我还不能让它工作。 (我需要将我的东西存储在地图中,因为字符串是单词,整数是频率,我需要稍后通过搜索键来“找到”这些对)

【问题讨论】:

  • A std::map<K, V> 总是按键排序。因此,将其存储在不同的容器中,甚至可能是 std::map<V, K>std::multimap<V, K>
  • 地图不是这样工作的。除非你想进入新的透明比较的东西,但你仍然不会从中获得性能。您是否考虑过在数据容器旁边维护一个 index 容器?为什么你认为你需要先按值排序,然后按键排序?这纯粹是为了迭代目的吗?同样,如果您的迭代和查找有不同的要求,那么这就是您需要第二个类似视图的容器 IMO 的标志。在这里可能对您有用的一件事是bimap...
  • @Deduplicator 这只是移动了球门柱,因为现在你打破了 K 的查找。
  • 也许填充std::set<std::pair<std::string, int>> 并为该集合提供您的比较功能会起作用吗?该集合应该可以通过您的地图迭代器构建。

标签: c++ sorting dictionary std


【解决方案1】:

std::map 只能按键排序(在您的情况下为字符串)。

如果您还需要按值对其进行排序,则需要创建一个std::multimap,其中int 作为键,string 作为值,并通过遍历地图来填充它。

或者,您也可以创建一个vector<pair<int,string>>,通过在地图上的迭代填充它,然后使用std::sort()

【讨论】:

    【解决方案2】:

    您可以使用std::multiset<std::pair<int, std::string>>

    【讨论】:

    • 为什么不是更简单的std::multimap<int, string>>
    • std::multimap 按键而不是按值订购。插入具有相同键的元素不按值排序 (en.cppreference.com/w/cpp/container/multimap/insert):“如果容器具有具有等效键的元素,则在该范围的上限插入。”(C++11 起)。因此,使用 std::multisetstd::set 对提供了一种对两者进行排序的方法。
    【解决方案3】:

    根据给定的信息,这有点像猜谜游戏,但除非您正在洗牌大量数据,否则可能会这样做。

    using entry = std::pair<std::string, int>;
    using CompareFunc = bool(*)(const entry&, const entry&);
    using sortset = std::set<entry, CompareFunc>;
    sortset bv(themap.begin(), themap.end(), [](auto& a, auto&b){ a.second!=b.second?a.second<b.second:a.first<b.first; });
    for(const auto& d : bv) {
        // 
    }
    

    【讨论】:

    • 为什么不简单的一组(int, std::string),然后可以去掉无用的操作符?
    • 我同意,这听起来更简洁,但我需要转换地图,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2012-11-30
    • 2018-09-05
    相关资源
    最近更新 更多