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



使用下面的代码:

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

  • https://code.woboq.org/gcc/libstdc + + v3/include/位/stl_map.h.html # 147

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

  • https://code.woboq.org/gcc/libstdc + + v3/include/位/stl_map.h.html # 1141

是否有办法使用Compare模板参数值比较?

是否有任何方法可以使用Compare模板参数进行值比较?

不,没有。std::map的元素仅根据键进行排序。

如果你想要一个std::pair<char,size_t>的容器相对于size_t排序,你可以使用std::set< std::pair<char,size_t>>和一个只比较second成员的自定义比较器。虽然这将与您的map非常不同,因为set将只存储具有唯一second的元素(由于自定义比较器),而map将存储具有唯一键的元素。

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

最新更新