对结构体vector进行sort(C++)
来源:互联网 发布:hadoop ssh 端口 编辑:程序博客网 时间:2024/04/30 02:44
自己写一个小程序时,自己定了一个结构体word,并使用了C++标准库中的vector来作为结构体word的容器。我在程序需要对所有的word进行排序。于是,问题来了:如何对结构体vector,使用标准库中vector封装好sort()来排序呢?
两种方法
- 两种方法
- 运算符的重构
- 编写 bool cmpconst void s1 const void s2
1. 运算符的重构
这是我定义的word(token:中文单词,lenPro:拼音个数(即为字数),Pro:拼音)
typedef struct word{ string token; int lenPro; vector<string> pro; bool operator<(const word& rhs) const //for asc { return lenPro < rhs.lenPro; } bool operator>(const word& rhs) const //for des { return lenPro > rhs.lenPro; }} word;
如word定义,我们重构了‘>’和‘<’运算符。我们用“<”的重构作为例子说明:
bool operator<(const word& rhs) const //for asc{ return lenPro < rhs.lenPro;}//这里我们选择了lenPro属性作为比较的基准//C++的函数重构格式这里就不说,因为就是一个固定格式,这里就不赘述了。//主要看“const word& rhs”的参数声明:C++中使用“&”,让函数的参数“成为”调用函数中对应的变量(在函数执行后,参数的改变是有效的,就像在调用函数中使用一下)//例如://#include <iostream>//#include <string>////using namespace std;////void getString1(string a);//void getString2(string& a);////int main()//{// string a = "Changed?";// cout<<"The source: "<<a<<endl;// cout<<"Start"<<endl;// getString1(a);// cout<<"After getString1: "<<a<<endl;// getString2(a);// cout<<"After getString2: "<<a<<endl;// return 0;//}////void getString1(string a)//{// a = "Keep Fighting!";// return;//}//void getString2(string& a)//{// a = "Keep Fighting!";// return;//}
如图所示,只有void getString2(string& a)中对a的操作是有效的,也就是a可以看做将“真正的变量a”传给了getString2()。
然后,我们这样使用“include < functional>”头文件中的”less< 结构体名称>()“和”greater< 结构体名称>()“来函数代替重构的“<”和“>”:
void lex::sortByLenAsc(){ sort(words.begin(), words.end(), less<word>()); return;}void lex::sortByLenDec(){ sort(words.begin(), words.end(), greater<word>()); return;}
我们读入数据后,调用函数:
int main(){ lex c; c.showWords(0, 10); cout << endl; c.sortByLenAsc(); c.showWords(0, 10); cout << endl; c.sortByLenDec(); c.showWords(0, 10); cout << endl << c.getLenWords() << endl; return 0;}
结果如下
2. 编写 “bool cmp(const void s1, const void s2);”
bool cmpAsc(const word& s1, const word& s2) //for sort{ return s1.lenPro < s2.lenPro;}bool cmpDec(const word& s1, const word& s2) //for sort{ return s1.lenPro > s2.lenPro;}
调用基本与前面相同:
void lex::sortByLenAsc(){ sort(words.begin(), words.end(), cmpAsc); return;}void lex::sortByLenDec(){ sort(words.begin(), words.end(), cmpDes); return;}
运行结果是相同,这里就不展示了。
至此,我们已经有两种方法来使用vector封装好的sort来对结构体vector进行升序(降序)排序了。
1 0
- 对结构体vector进行sort(C++)
- sort对结构体进行排序
- C++ sort 对结构体进行排序
- 利用sort()对结构体数组进行排序
- 利用sort对结构体数组进行排序
- sort对结构体进行排序(区间排序)
- STL中对vector容器中的结构体进行排序
- 对vector进行sort时,cmp函数的写法
- vector sort结构体排序要点
- C++ 结构体vector使用sort排序
- sort 对结构体排序
- sort对结构体排序
- sort 对vector排序
- 结构体排序,sort排序,c++sort
- .net 利用array.sort对结构数组进行排序
- vector元素为自定义结构体类型时如何对容器元素进行排序?
- vector元素为自定义结构体类型时如何对容器元素进行排序?
- 简谈俩种不同方式对vector容器的 自定义结构体进行排序
- Angularjs绑定数据时对html标签的转义
- 孤儿进程和僵死进程的总结----很好的一篇文章,记录下来
- webservice的远程调用方法
- 架构师之决策
- MQTT学习了解------阿冬专栏
- 对结构体vector进行sort(C++)
- LeetCode 092: Reverse Linked List II
- 怎么在几何画板中切割三棱锥
- awk截取字符串 权限
- Python调用(运行)外部程序
- 用Shape标签创建Drawable画ring圆环
- 如何分析解决Android ANR
- SSH笔记
- 解析xml内容-Reply节点的属性2【华为】