stl之map 排序

  排序问题,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 <string>
 3 using namespace std;
 4 typedef struct tagStudentInfo
 5 {
 6     int      nID;
 7     string   strName;
 8 }StudentInfo, *PStudentInfo;  //学生信息
 9
10 class sort{
11 public:
12     bool operator() (StudentInfo const &_A, StudentInfo const &_B) const
13     {
14         if(_A.nID < _B.nID){         return true;
15         }else if (_A.nID == _B.nID){         return _A.strName.compare(_B.strName) < 0;      }
16         return false;
17     }
18 };
19
20 int main()
21 {
22     int nSize;          //用学生信息映射分数
23     map<StudentInfo, int, sort>mapStudent;
24     studentInfo studentInfo;
25     studentInfo.nID = 1;
26     studentInfo.strName = "student_one";
27
28     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
29     studentInfo.nID = 2;
30     studentInfo.strName = "tudent_two";
31     mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
32 }
时间: 2024-10-08 22:34:18

stl之map 排序的相关文章

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

STL容器(三)——对map排序

STL容器(三)--对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~(还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列的情况. Example

C++ STL中Map的按Key排序跟按Value排序(转)

C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学生姓名快速的查找到 他的成绩. 但是,我们除了希望能够查询

STL中map与hash_map的比较

1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O(1), 最坏的时间复杂度:O(n) 总体来说:hash_map 比 map 查找速度快,而且查找速度基本和数据量大小无关,属于常数级别,节省一定内存,如果没有必要排序的话,尽量使用 hash_map . 注:hash还有hash函数的耗时.当有100w条记录的时候,map也只需要20次的比较,20

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名

对vector等STL标准容器进行排序操作(转!)

西方有句谚语:不要重复发明轮子! STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已不用拘泥于算法本身,从而站在巨人的肩膀上去考虑更高级的应用. 排序是最广泛的算法之一,本文详细介绍了STL中不同排序算法的用法和区别. 1 STL提供的Sort 算法 C++之所以得到这么多人的喜欢,是因为它既具有面向对象的概念,又保持了C语言高效的特点.STL 排序算法同样需要保持高效.因此,对于

STL 之 map的用法

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处. 下面举例说明什么是一对一的数据映射.比如一个班级中,每个学生的学号跟他的姓名就存在着一一

STL之Map的运用

Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1. map最基本的构造函数: map<string , int >mapstring;         map<int ,string >mapint; map<sring, char>mapstring;         map< char ,string>mapchar; map<char ,int>