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;
 - }
 
                    
                
                
            
        
浙公网安备 33010602011771号