使用下面的代码:
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
在插入时检查唯一性。