C++ 模板 map 如何根据 key 排序

【字号: 日期:2023-05-25浏览:16作者:雯心

问题描述

定义了一个

template <typename T>std::map<const T, std::list<const T>*> map;

实际使用时 T 可能会是 char*,也可能是 long需要针对 T 的类型进行排序,可是单纯使用

struct CompareByLongValue { bool operator()(const long& k1, const long& k2) {return k1 < k2; }};

或是添加 template 声明后强制转换都编译过不去,求解

忧郁的更新:

实际上,我想将上面的那个 map 放到一个模板类里面去,在类内部实际上只支持为数不多的类型操作,比如 long, char*,所以想在类内部自动排序。

template <typename T>class Mapping { public: Mapping(); virtual ~Mapping(); private: std::map<const T, std::list<const T>*>* mapping_;};

如果在 map 定义的时候传入一个如下定义的结构体:

template <typename T>struct CompareByLongValue { bool operator()(const T& k1, const T& k2) { return k1 < k2; }};

编译器会不乐意:

No matching function for call to object of type ’const CompareByLongValue<long>’

分别在 stl map 的:

_LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _Key& __y) const// 460{return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);} _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _CP& __y) const// 463{return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}// 以及 1207if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))

问题解答

回答1:

map 默认的比较对象的类型是 std::less<Key>

你可以看一下map的定义:

template< class Key, class T, class Compare = std::less<Key>, class Allocator = std::allocator<std::pair<const Key, T> >> class map;

如果你要修改默认的比较行为,可以在构造时传入你定义的比较类:map<long, string, CompareByLongValue> amap;

如果你的“map'变量是一个未指定具体类型的map类型, 那一种做法就是 Compare 也定义成一个模板类: map<T, string, MyCompare< T > > amap; 然后定义特化的MyCompare类。

template <> class MyCompare<long>{ bool operator()(const long& a, const long& b) const {... }}回答2:

long,char* 都不需要自定义比较啊。你的template <typename T>std::map<const T, std::list<const T>*> map;

是不是想写成template<typename T>using m_map=std::map<const T, std::list<const T>*> map;?

相关文章: