• 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;  
    • }  
  • 相关阅读:
    HAL驱动的串口编程陷阱
    ST推出新软件STM32Cube ,让STM32微控制器应用设计变得更容易、更快、更好用
    零宽断言 -- Lookahead/Lookahead Positive/Negative
    Eclipse 正则表达式 查找与替换
    MSDN WinUSB Example
    培训SQLServer 嵌套事务PPT分享
    SQL Server数据库备份的镜像
    禁用nested loop join里的spool
    日常办公工具利器 notepad++
    Change the Target Recovery Time of a Database (SQL Server) 间接-checkpoints flushcache flushcache-message
  • 原文地址:https://www.cnblogs.com/hipposinsilt/p/6770617.html
Copyright © 2020-2023  润新知