家里只介绍关于list, vector, deque, map的排序,其中又分米两类,一是本身具有自动排序功能的,如:map,另一种是本身带有排序函数sort的,如:list, vector, deque
由sort函数排序的,这里以vector为例:
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char **argv)
{
vector<int> vNum;
vNum.push_back(1);
vNum.push_back(3);
vNum.push_back(9);
vNum.push_back(7);
vNum.push_back(11);
cout << "before sort: " << endl;
for (it=vNum.begin(); it!=vNum.end(); it++) {
cout << *it << " ";
}
cout << endl;
vNum.sort(vNum.begin(), vNum.end());
cout << "after sort: " << endl;
for(it=vNum.begin(); it!=vNum.end(); it++) {
cout << *it << " ";
}
cout << endl;
}运行结果如下:
before sort:
1 3 9 7 11
after sort:
1 3 7 9 11
排序结果默认为从小到大排序,如果想店排序为从大到小,只需要在sort中加入一个比较函数comp():
#include <iostream>
#include <vector>
using namespace std;
bool comp(const int &a, const int &b)
{
return a>b;
}
int main(int argc, char **argv)
{
vector<int> vNum;
vNum.push_back(1);
vNum.push_back(3);
vNum.push_back(9);
vNum.push_back(7);
vNum.push_back(11);
cout << "before sort: " << endl;
for (it=vNum.begin(); it!=vNum.end(); it++) {
cout << *it << " ";
}
cout << endl;
vNum.sort(vNum.begin(), vNum.end(), comp);
cout << "after sort: " << endl;
for(it=vNum.begin(); it!=vNum.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
运行结果如下:
before sort:
1 3 9 7 11
after sort:
11 9 7 3 1
出现家样的结果是因为,比较时sort函数根据comp函数进行判断输的大小,系统默认a<b时返回真,于是从小到大排,而我的comp函数设定为a>b时返回为真,那么最终得到的排序结果也相应的从小到大变成从大到小。
map中的排序:
第一种:小于号重载,程序举例
- #include <map>
- #include <string>
- uing namespace std;
- Typedef struct tagStudentInfo
- {
- int nID;
- String strName;
- }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<<endl<<iter->first.strName<<endl<<iter->second<<endl;
- }
以上程序是无法编译通过的,只要重载小于号,就OK了,如下:
- 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; //学生信息
第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明
- #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;
- 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));
- }
本文详细介绍了C++标准库中的几种容器(vector、list、deque、map)的排序方法,包括默认升序排序及如何实现降序排序。此外,还探讨了map容器中的排序策略,包括重载小于号运算符和使用仿函数进行定制化排序。
1530

被折叠的 条评论
为什么被折叠?



