C++ 模板 map 如何根据 key 排序
定义了一个
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);}
// 以及 1207
if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
map 默认的比较对象的类型是 std::less<Key>
你可以看一下map的定义:
如果你要修改默认的比较行为,可以在构造时传入你定义的比较类:map<long, string, CompareByLongValue> amap;
如果你的“map"变量是一个未指定具体类型的map类型, 那一种做法就是 Compare 也定义成一个模板类: map<T, string, MyCompare< T > > amap;
然后定义特化的MyCompare类。
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;
?