stl之map 排序

简介:   排序问题,STL中默认是采用小于号来排序的,因为设置int等类型做key,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题: 第一种:小于号重载,程序举例 1 ...

  排序问题,STL中默认是采用小于号来排序的,因为设置int等类型做key,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题:

第一种:小于号重载,程序举例

 1 #include <map>
 2 #include <string>
 3 using namespace std;
 4 typedef struct tagStudentInfo
 5 {
 6        int      nID;
 7        string   strName;
 8 }StudentInfo, *PStudentInfo;  //学生信息
 9 
10 int main()
11 {
12     int nSize;          //用学生信息映射分数
13     map<StudentInfo, int>mapStudent;
14     map<StudentInfo, int>::iterator iter;
15     StudentInfo studentInfo;
16     studentInfo.nID = 1;
17     studentInfo.strName = “student_one”;
18     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
19     studentInfo.nID = 2;
20     studentInfo.strName = “student_two”;
21 
22     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
23     for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
24         cout<<iter->first.nID<<endl<<iter->first.strName<<endl<<iter->second<<endl;
25 }
26 //以上程序是无法编译通过的,只要重载小于号,就OK了,如下:
27 
28 typedef struct tagStudentInfo
29 {
30    int      nID;
31    string   strName;
32    Bool operator < (tagStudentInfo const& _A) const
33    {   
34       //这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序
35       if(nID < _A.nID)  return true;
36       if(nID == _A.nID) return strName.compare(_A.strName) < 0;
37       return false;
38    }   
39 }StudentInfo, *PStudentInfo;  //学生信息

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

 1 #include <map>
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5 
 6 typedef struct tagStudentInfo
 7 {
 8     int      nID;
 9     string   strName;
10 }StudentInfo, *PStudentInfo;  //学生信息
11 
12 class sort{
13 public:
14     bool operator() (StudentInfo const & _A, StudentInfo const & _B) const
15     {
16         if(_A.nID < _B.nID){
17             return true;
18         }else if (_A.nID == _B.nID){
19             return _A.strName.compare(_B.strName) < 0;
20         }
21         return false;
22     }
23 };
24 
25 int main()
26 {
27     int nSize;          //用学生信息映射分数
28     map<StudentInfo, int, sort> mapStudent;
29     StudentInfo studentInfo;
30     studentInfo.nID = 1;
31     studentInfo.strName = "student_one";
32 
33     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
34     studentInfo.nID = 2;
35     studentInfo.strName = "tudent_two";
36     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
37 
38     std::map<StudentInfo, int, sort>::iterator  it;
39     for(it = mapStudent.begin(); it != mapStudent.end(); it++){
40         std::cout << it->second << std::endl;
41     }
42 }

 

相关文章
|
1月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
18 0
|
6月前
|
C++ 容器
【C++】红黑树模拟实现STL中的map与set
【C++】红黑树模拟实现STL中的map与set
|
5月前
|
存储 编译器 C++
|
4月前
|
存储 算法 C++
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
64 0
|
4月前
|
存储 C++ 索引
C++基础知识(八:STL标准库 Map和multimap )
C++ 标准模板库(STL)中的 map 容器是一种非常有用的关联容器,用于存储键值对(key-value pairs)。在 map 中,每个元素都由一个键和一个值组成,其中键是唯一的,而值则可以重复。
|
5月前
|
C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
44 0
|
5月前
|
存储 C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
76 0
|
6月前
|
C++ 索引 容器
黑马c++ STL部分 笔记(9) map/multimap容器
黑马c++ STL部分 笔记(9) map/multimap容器
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用