如何使用std::map的Compare模板参数进行值比较?

How to use the Compare template parameter of std::map for value comparison?

使用此代码:

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 模板参数,将用作键的比较函数:

但是它还有两个功能return比较对象:

有什么方法可以使用Compare模板参数进行值比较吗?

Is there any way to use the Compare template parameter for value comparison?

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

如果您想要 std::pair<char,size_t> 的容器根据 size_t 排序,您可以将 std::set< std::pair<char,size_t>> 与仅比较 second 成员的自定义比较器一起使用.尽管这与您的地图有很大不同,因为该集合仅存储具有唯一 second 的元素(由于自定义比较器),而地图存储具有唯一键的元素。

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