C++的STL中提供了很强大的排序函数sort,可以对任意数组,结构体及类进行排序,下面我们先来看最简单的数组排序。默认的升序排列,我们也可以在后面加上less或greater来告诉编译器我们想要的排序顺序。

vector<int> v = {, , , , , , };

// Ascending order
sort(v.begin(), v.end());
sort(v.begin(), v.end(), less<int>()); // Descending order
sort(v.rbegin(), v.rend());
sort(v.begin(), v.end(), greater<int>());

如果是一个二维数组,也可以是用sort,我们可以选择根据某一列来进行排序,如果我们不重写cmp函数,那么默认的是根据第一列来排序,当然我们可以通过重写来根据其他列来排序:

/* Input matrix
m = [
1 4 2
0 8 3
3 5 1
]
*/ // Ascending order by first column
sort(m.begin(), m.end());
/*
m = [
0 8 3
1 4 2
3 5 1
]
*/ // Descending order by first column
sort(m.rbegin(), m.rend());
/*
m = [
3 5 1
1 4 2
0 8 3
]
*/ // Ascending order by second column
sort(m.begin(), m.end(), [](const vector<int> &a, const vector<int> &b) { return a[] < b[]; } ); bool cmp(const vector<int> &a, const vector<int> &b) {
return a[] > b[];
}
sort(m.begin(), m.end(), cmp);
/*
m = [
1 4 2
3 5 1
0 8 3
]
*/ // Descending order by second column
sort(m.begin(), m.end(), [](const vector<int> &a, const vector<int> &b) { return a[] > b[]; } ); bool cmp(const vector<int> &a, const vector<int> &b) {
return a[] < b[];
}
sort(m.begin(), m.end(), cmp);
/*
m = [
0 8 3
3 5 1
1 4 2
]
*/

下面来看如何给class排序,我们将自定义的类class装入到容器vector中,然后根据class中的一个参数为依据进行排序,这里分两种情况,一个是vector中装指针的class,一种的装正常的class,它们再重写cmp比较函数上有些区别的,参见代码如下:

class A {
public:
int a1, a2;
A(int m, int n): a1(m), a2(n) {}
}; class B {
public:
int b1, b2;
B(int m, int n): b1(m), b2(n) {}
}; bool cmp1(A const *a, A const *b) {
return a->a1 < b->a1;
} bool cmp2(B const &a, B const &b) {
return a.b1 < b.b1;
} void printArray(vector<A*> array) {
for (int i = ; i < array.size(); ++i) {
cout << array[i]->a1 << " " << array[i]->a2 << endl;
}
cout << endl;
} void printArray2(vector<B> array) {
for (int i = ; i < array.size(); ++i) {
cout << array[i].b1 << " " << array[i].b2 << endl;
}
cout << endl;
} int main() { vector<A*> array;
array.push_back(new A(, ));
array.push_back(new A(, ));
array.push_back(new A(, ));
array.push_back(new A(, ));
array.push_back(new A(, ));
array.push_back(new A(, )); printArray(array);
sort(array.begin(), array.end(), cmp1);
printArray(array); vector<B> array2;
array2.push_back(B(, ));
array2.push_back(B(, ));
array2.push_back(B(, ));
array2.push_back(B(, ));
array2.push_back(B(, ));
array2.push_back(B(, )); printArray2(array2);
sort(array2.begin(), array2.end(), cmp2);
printArray2(array2); return ;
}

C++ sort vector<vector<int> > or vector<MyClass> 容器的排序的更多相关文章

  1. const vector<int> 和 vector<const int>问题讨论

    1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...

  2. CodeForces - 93B(贪心+vector<pair<int,double> >+double 的精度操作

    题目链接:http://codeforces.com/problemset/problem/93/B B. End of Exams time limit per test 1 second memo ...

  3. vector向量容器元素排序与查找

    1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector> vector<int> ...

  4. 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

    之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中.vector A中的结果我们可想而知,可是vector B中的元素还会怎样? 看看之前写过的程序: ...

  5. 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())

    关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为 ...

  6. Java中Array.sort()的几种用法(需要初始化要排序的对象)

    ====================================================== 1.Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且 ...

  7. 使用泛型实现对int数组或者String数组进行排序

    因为是使用的泛型,我们并不确定数据类型, 对于数据的比较就不能用平时的大于或者小于. 我们需要比较对象实现Comparable接口,该接口下的compareTo()方法可以用来比大小 定义Sort类: ...

  8. Codeforces Global Round 6D(VECTOR<ARRAY<INT,3> >)

    一个人只要存在债务关系,那么他的债务可以和这整个债务关系网中任何人连边,和他当初借出或欠下的人没有关系.只需要记录他的债务值即可. #define HAVE_STRUCT_TIMESPEC #incl ...

  9. hdu 4557 非诚勿扰 vector的应用 原来vector 可以删除指定位置元素 不过消耗大

    非诚勿扰 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi ...

随机推荐

  1. JavaScript 使用 sort() 方法从数值上对数组进行排序

    使用 sort() 方法从数值上对数组进行排序. <html> <body> <script type="text/javascript"> f ...

  2. SQL表值函数和标量值函数的区别

    SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...

  3. Apache配置文件中的deny和allow的使用

    Apache配置文件中的deny和allow的使用 由于产品的需要,最近在配置apache的负载均衡功能,但是在配置虚拟主机的访问权限的时候我们遇到了一些问题.主要问题是deny和allow的执行顺序 ...

  4. mysql update case when和where之间的注意事项

    在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新.有时候因为对这几个字句理解得不透彻会带来很大的困扰.因此 ...

  5. 【HTTP协议】响应头中的Content-Length和Transfer-Encoding

    来源: http://blog.csdn.net/superhosts/article/details/8737434 http://bbs.csdn.net/topics/390384017 对于h ...

  6. dbVisualizer连接mysql

  7. kmv xml 文件配置vnc 端口冲突 会无法启动

    <graphics type=' autoport='no' listen='0.0.0.0'> 如果有多个虛机用相同vnc port的话,只能有一个可以启动,所以vnc port号是唯一 ...

  8. 1.单件模式(Singleton Pattern)

    意图:为了保证一个类仅有一个实例,并提供一个访问它的全局访问点. 1.简单实现(多线程有可能产生多个实例) public class CommonSigleton { /// <summary& ...

  9. php 的函数参数值类型限定

    如例: function test(array $a,test $b){ /*...*/ } class test{ /*...*/ } test(array(),new test); 表示test函 ...

  10. VIM Tutorials----(updating)

    This is my first English tutorial; I hope I can help you to learn VIM. Any question send email to me ...