博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
map重写比较器
阅读量:5332 次
发布时间:2019-06-14

本文共 2267 字,大约阅读时间需要 7 分钟。

结构体作为map的key或放入set中,需要重载
<运算符,如下:typedef struct tagroadkey{ int m_i32type; m_i32scale; bool operator <(const tagroadkey& other) const 注意是const函数!! { if (m_i32type !="other.m_i32Type)" 类型按升序排序 return < other.m_i32type); } else 如果类型相同,按比例尺升序排序 (m_i32scale other.m_i32scale); }} roadkey;也可以重载>
运算符,示例如下:#include
#include
#include
using namespace std;class Array{private: int m_i32Num1; int m_i32Num2;public: Array(int i32Num1, int i32Num2); bool operator >(const Array& other) const;};Array::Array(int i32Num1, int i32Num2){ m_i32Num1 = i32Num1; m_i32Num2 = i32Num2;}bool Array::operator >(const Array& other) const{ if (m_i32Num1 > other.m_i32Num1) { return true; } else { return false; }}// 此结构体作为map的valuestruct TInfo{ int m_i32Num1; int m_i32Num2;};int main(int argc, char* argv[]){ map
> stMap; TInfo stInfo1 = { 1, 1}; stMap.insert(pair
(Array(1, 2), stInfo1)); TInfo stInfo2 = { 2, 1, 1 }; stMap.insert(pair
(Array(2, 2), stInfo2)); TInfo stInfo3 = { 3, 1, 1 }; stMap.insert(pair
(Array(3, 2), stInfo3)); for (map
>::iterator it = stMap.begin(); it != stMap.end(); ++it) { cout << it->second.m_i32Num1 << endl; } return 0;}说明: map缺省是用less
作为比较器,所以它要求作为Key的类要重载“<”操作符,没有重载“<”操作符,而是重载了“>”操作符就会报错。反之,也可以显式地用greater
作为比较器,此时就必要重载Key类中的“>”操作符了。附:stl中map和set的声明,二者比较像,底层都是用红黑树实现的template < class Key, class Compare = less
, class Allocator = allocator
> class set;template < class Key, class T, class Compare = less
, class Allocator = allocator
> > class map; template < class Key, class Compare = less
, class Allocator = allocator
> class multiset; template < class Key, class T, class Compare = less
, class Allocator = allocator
> > class multimap; 从上面的声明可以看出,也可以定义一个函数对象Compare,声明map或set类型时传进入,如:struct TTimeCompare{ bool operator ()(const CTimerEvent* po1, const CTimerEvent* po2)const { return (po1->m_oNextTick < po2->m_oNextTick); }};typedef multiset
TEventSet;struct ltstr // less than{ bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; }};set
stSet; // set
map
stMap; // map
struct eqstr // equal{ bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) == 0; }};hash_map
, eqstr> stHashMap; // hash_map
// 自定义hash函数namespace std{ template<> struct hash
{ size_t operator()(const KEY_TYPE& key) const { //return key.Hash(); } };}

 相等的时候返回false,否则报错

转载于:https://www.cnblogs.com/zzyoucan/p/3677891.html

你可能感兴趣的文章
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>