【问题标题】:How to use the Compare template parameter of std::map for value comparison?如何使用 std::map 的 Compare 模板参数进行值比较?
【发布时间】:2021-08-19 10:48:18
【问题描述】:

使用此代码:

namespace nonstd {
template <class Key,
          class T,
          class Compare = std::greater<T>,
          class Allocator = std::allocator<std::pair<Key const, T>>
          >
using map = std::map<Key, T, Compare, Allocator>;
}

int main() {
  nonstd::map<char, std::size_t> const values = {
    {'A', 3}, {'B', 2}, {'C', 5}
  };

  for (auto const& value : values) {
    std::clog << value.first << " : " << value.second << std::endl;
  }
}

我希望:

C : 5
A : 3
B : 2

但我得到了:

C : 5
B : 2 // <---
A : 3

我检查了std::map 的GNU 实现,我看到我们传递的Compare 模板参数将用作Key 的比较函数:

但它也有两个函数返回比较对象:

有没有办法使用Compare模板参数进行值比较?

【问题讨论】:

  • 元素是根据键而不是映射值排序的。这与您的nonstd::map 无关
  • 这必须是XY problem
  • 为什么要对映射的值进行排序?严格来说,那不是map。还有其他容器可以根据其元素的second 成员进行排序
  • @StoryTeller-UnslanderMonica,只是好奇和学习。
  • 库实现中类的私有部分并不是了解如何使用标准容器的最佳场所。您可以在那里挖掘以了解实施细节,但要做好努力的准备。

标签: c++ stdmap


【解决方案1】:

有没有办法使用 Compare 模板参数进行值比较?

不,没有。 std::maps 元素仅根据键排序。

如果您想要一个相对于size_ts 排序的std::pair&lt;char,size_t&gt; 容器,您可以将std::set&lt; std::pair&lt;char,size_t&gt;&gt; 与仅比较second 成员的自定义比较器一起使用。虽然这与您的地图有很大不同,因为该集合仅存储具有唯一 second 的元素(由于自定义比较器),而地图存储具有唯一键的元素。

如果没有其他帮助,您始终可以使用 std::vector&lt; std::pair&lt;char,size_t&gt;&gt; 并使用 std::sort 对其进行排序,并使用 std::find_if 在插入时检查唯一性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2016-07-23
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多