说明:
下面程序给出了如何对自定义结构的特殊排序,主要利用STL中的sort排序算法完成。
#include "stdafx.h" #include <string.h> #include <algorithm> #include <vector> #include <deque> #include <functional> #include <iostream> #include <list> #include <sstream> #include <iterator> #include <functional> using namespace std; struct tagStudent { string strName; int nAge; }; //自定义谓词函数进行比较 //每个比较条件,均需使用“<”,否则程序异常 bool lessLength(const tagStudent &a, const tagStudent& b) { if (a.nAge == b.nAge) { //姓名长度相等,则按照字典排序 if (a.strName.length() == b.strName.length()) { return a.strName < b.strName; } else { return a.strName.length() < b.strName.length(); } } else { return a.nAge < b.nAge; } } //使用function中的函数,进行比较,只能重载< //每个比较条件,均需使用“<”,否则程序异常 bool operator< (const tagStudent &a, const tagStudent& b) { if (a.nAge == b.nAge) { return a.strName < b.strName;//字典排序 } else { return a.nAge < b.nAge; } } int _tmain(int argc, _TCHAR* argv[]) { stringstream ss; //字符串流含义:姓名 年龄 姓名 年龄 string str = "Abel 10 Ruby 15 Jin 10 Dave 15 Botton 35 Jone 35"; string strWord; struct tagStudent stTemp; vector<tagStudent> vecStudentInfos; ss.clear(); ss.str(str); //提取字符串码流中的信息 while (ss >> strWord) { stTemp.strName = strWord; strWord.clear(); ss >> strWord; stTemp.nAge = atoi(strWord.c_str()); vecStudentInfos.push_back(stTemp); } cout << "sort before:" << endl; vector<tagStudent>::iterator it = vecStudentInfos.begin(); for (; it != vecStudentInfos.end(); ++it) { cout << "(" <<it->strName << "," << it->nAge <<")" << endl; } //方法一:重载< cout << "sort after by dictionary:" << endl; sort(vecStudentInfos.begin(), vecStudentInfos.end(), less<tagStudent>()); for (it = vecStudentInfos.begin(); it != vecStudentInfos.end(); ++it) { cout << "(" <<it->strName << "," << it->nAge <<")" << endl; } //方法二:谓词函数 cout << "sort after by string length:" << endl; sort(vecStudentInfos.begin(), vecStudentInfos.end(), lessLength); for (it = vecStudentInfos.begin(); it != vecStudentInfos.end(); ++it) { cout << "(" <<it->strName << "," << it->nAge <<")" << endl; } return 0; }