版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/89784646
一 点睛
vector是个模板类,可以存放任何类型的对象。在vector中存放结构体时,可以按照自定义的排序方式排序。
二 vector中存放结构体时的排序
1 代码
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef struct rect{
int id;
int length;
int width;
bool operator< (const rect &a) const{
if(id!=a.id)
return id<a.id;
else{
if(length!=a.length)
return length<a.length;
else
return width<a.width;
}
}
}Rect;
int main(){
vector<Rect> vec;
Rect rect;
rect.id=2;
rect.length=3;
rect.width=4;
vec.push_back(rect);
rect.id=1;
rect.length=2;
rect.width=3;
vec.push_back(rect);
vector<Rect>::iterator it=vec.begin();
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
sort(vec.begin(),vec.end());
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
return 0;
}
2 运行
[root@localhost charpter03]# g++ 0310.cpp -o 0310
[root@localhost charpter03]# ./0310
2 3 4
1 2 3
3 说明
vec中存放的是结构体Rect。vec未进行排序前,将会按照push_back的时间顺序排序,并不会自动排序。排序后可以按照结构体中对rect的重载方式进行排序;按照id、length、width升序排序,然后用<algorithm>中的sort函数排序。
三 结构体外定义比较函数进行排序
1 代码
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef struct rect{
int id;
int length;
int width;
}Rect;
int cmp(Rect a,Rect b){
if(a.id!=b.id)
return a.id<b.id;
else{
if(a.length!=b.length)
return a.length<b.length;
else
return a.width<b.width;
}
}
int main(){
vector<Rect> vec;
Rect rect;
rect.id=2;
rect.length=3;
rect.width=4;
vec.push_back(rect);
rect.id=1;
rect.length=2;
rect.width=3;
vec.push_back(rect);
vector<Rect>::iterator it=vec.begin();
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
sort(vec.begin(),vec.end(),cmp);
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
return 0;
}
2 运行
[root@localhost charpter03]# g++ 0311.cpp -o 0311
[root@localhost charpter03]# ./0311
2 3 4
1 2 3
3 说明
该例并为对结构体中的<进行重载,而是在结构体外定义了一个比较函数;另外sort的调用方式也不相同,加了比较函数作为第3个参数。