STL—map之总结

来源:互联网 发布:nginx多ip域名绑定 编辑:程序博客网 时间:2024/04/29 14:28
一.map的原型
1.map
template <class _Key, class _Tp, class _Compare, class _Alloc>
class map {...}


2.multimap
template <class _Key, class _Tp, class _Compare, class _Alloc>
class multimap {...}


由此可以看出我们可以根据需要自定义compare Function


二.自定义compare Function
2.1重载<操作运算符


2.1.1以成员函数方式去重载
inline bool operator<(const myClass &_myclass) const {if(id != _myclass.id)return id < _myclass.id;elsereturn name < _myclass.name;}

2.2.2以友元函数方式去重载
bool operator<(const myClass &m1, const myClass &m2){if(m1.getID() != m2.getID())return m1.getID() < m2.getID();elsereturn m1.getString() < m2.getString();}

2.2.3以函数对象的方式去定义
struct myCompare{bool operator()(const myClass &m1, const myClass &m2){if(m1.getID() != m2.getID())return m1.getID() < m2.getID();elsereturn m1.getString() < m2.getString();}};

注意点:在自定义比较函数时,不能丢失const


三.例子

代码如下;

#include <iostream>#include <map>//#include <unordered_map>#include <string>#include <algorithm>using std::cin;using std::cout;using std::endl;using std::string;using std::sort;using std::map;//using std::unordered_map;using std::string;const int N = 1003;class myClass{private:string name;int id;public:string getString() const { return name; }int getID() const {return id; }myClass(string _name, int _id):name(_name), id(_id) {}//重载<操作运算符的时候不能丢掉const/*inline bool operator<(const myClass &_myclass) const {if(id != _myclass.id)return id < _myclass.id;elsereturn name < _myclass.name;}*/inline friend bool operator<(const myClass &m1, const myClass &m2);};//重载<操作运算符的时候不能丢掉constbool operator<(const myClass &m1, const myClass &m2){if(m1.getID() != m2.getID())return m1.getID() < m2.getID();elsereturn m1.getString() < m2.getString();}struct myCompare{bool operator()(const myClass &m1, const myClass &m2){if(m1.getID() != m2.getID())return m1.getID() < m2.getID();elsereturn m1.getString() < m2.getString();}};int main(){freopen("./output.txt", "w", stdout);map<myClass, int, myCompare> cMap;for(int i = 0; i < N; i++){string tName = "cjw";char ss[10];string tmp;sprintf(ss, "%d", i);tmp = ss;tName = tName + tmp;myClass tClass(tName, i);cMap[tClass] = i * 2;}for(map<myClass, int, myCompare>::iterator ite = cMap.begin(); ite != cMap.end(); ite++){cout << ite->first.getString() << " " << ite->first.getID() << " " << ite->second << endl;}}