C++ STL map 随手笔记

template<

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

> class map;
 
关联容器,提供一对一的数据处理能力,map内部自建一课红黑树(一种非严格意义上的平衡二叉树),具有自动排序的功能,因此map内部所有的数据都是有序的。
快速查找的复杂度是log(n)。
 
swap 不是同一个map的元素的swap,而是两个map的swap
find
erase
count
 
map中的元素是自动按Key升序排序,所以不能对map用sort函数;
 
 这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int 型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去。下面给出两个方法解决这个问题。
第一种:小于号重载,程序举例。
#include <iostream>  
  • #include <string>  
  • #include <map>  
  • using namespace std;  
  •   
  • typedef struct tagStudentinfo  
  •   
  • {  
  •   
  •        int      niD;  
  •   
  •        string   strName;  
  •   
  •        bool operator < (tagStudentinfo const& _A) const  
  •   
  •        {     //这个函数指定排序策略,按niD排序,如果niD相等的话,按strName排序  
  •   
  •             if(niD < _A.niD) return true;  
  •   
  •             if(niD == _A.niD)  
  •   
  •                 return strName.compare(_A.strName) < 0;  
  •   
  •         return false;  
  •   
  •        }  
  •   
  • }Studentinfo, *PStudentinfo; //学生信息  
  •   
  • int main()  
  •   
  • {  
  •   
  •     int nSize;   //用学生信息映射分数  
  •   
  •     map<Studentinfo, int>mapStudent;  
  •   
  •     map<Studentinfo, int>::iterator iter;  
  •   
  •     Studentinfo studentinfo;  
  •   
  •     studentinfo.niD = 1;  
  •   
  •     studentinfo.strName = "student_one";  
  •   
  •     mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));  
  •   
  •     studentinfo.niD = 2;  
  •   
  •     studentinfo.strName = "student_two";  
  •   
  •     mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));  
  •   
  •     for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)  
  •   
  •         cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;  
  •   
  •     return 0;  
  • }  

第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明。

//第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明  

  •   
  • #include <iostream>  
  •   
  • #include <map>  
  •   
  • #include <string>  
  •   
  • using namespace std;  
  •   
  • typedef struct tagStudentinfo  
  •   
  • {  
  •   
  •        int      niD;  
  •   
  •        string   strName;  
  •   
  • }Studentinfo, *PStudentinfo; //学生信息  
  •   
  • class sort  
  •   
  • {  
  •   
  • public:  
  •   
  •     bool operator() (Studentinfo const &_A, Studentinfo const &_B) const  
  •   
  •     {  
  •   
  •         if(_A.niD < _B.niD)  
  •   
  •             return true;  
  •   
  •         if(_A.niD == _B.niD)  
  •   
  •             return _A.strName.compare(_B.strName) < 0;  
  •   
  •     return false;  
  •   
  •     }  
  • };  
  •   
  • int main()  
  •   
  • {   //用学生信息映射分数  
  •   
  •     map<Studentinfo, int, sort>mapStudent;  
  •   
  •     map<Studentinfo, int>::iterator iter;  
  •   
  •     Studentinfo studentinfo;  
  •   
  •     studentinfo.niD = 1;  
  •   
  •     studentinfo.strName = "student_one";  
  •   
  •     mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));  
  •   
  •     studentinfo.niD = 2;  
  •   
  •     studentinfo.strName = "student_two";  
  •   
  •     mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));  
  •   
  •     for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)  
  •   
  •         cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;  
  • }  
原文地址:https://www.cnblogs.com/hipposinsilt/p/6770617.html