algorithm
是c++STL标准库的头文件之一,提供了许多功能。下面列举一些常用函数的基本用法。
注意需要std名字空间。
reverse()
该函数可使数组,字符串,STL容器中的元素逆向排序。注意此函数调用后没有返回值而是将原先的变量直接修改为排序后的版本。
数组:
用法为:
reverse(<数组名称>+排序起始坐标,<数组名称>+排序结束坐标)
左闭右开。
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include<iostream> #include<algorithm> using namespace std; void pntarr(int num[],int n) { for (int i = 0; i <n; i++) { cout << num[i]<<" "; } cout << endl; } int main() { int a[5] = { 1,2,3,4,5 }; pntarr(a,5); reverse(a, a + 5); pntarr(a,5); }
|
c++没有内置输出数组长度的函数,一般都是用sizeof(<数组名>)/sizeof(<数组名>[0])
实现,但数组在作为函数形参时会退化为指针,而此时这方法就没用了(T_T)而此种情况按网上的说法要使用模板解决,然而这东西还没学呢(╯‵□′)╯︵┻━┻太麻烦了,溜了溜了
此代码输出:
字符串:
用法为reverse(<字符串名称>.begin(),<字符串名称>.end())
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include<iostream> #include<string> #include<algorithm> using namespace std; void pntarr(string num) { for (int i = 0; i <num.size(); i++) { cout << num[i]<<" "; } cout << endl; } int main() { string a = "12345"; pntarr(a); reverse(a.begin(), a.end()); pntarr(a); }
|
字符串有strlen()
和size()
函数就方便多了。
此代码输出:
容器(vector)
用法和字符串相同,为
reverse(<容器名称>.begin(),<容器名称>.end())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include<iostream> #include<vector> #include<algorithm> using namespace std; void pntarr(vector<int> num) { for (int i = 0; i <num.size(); i++) { cout << num[i]<<" "; } cout << endl; } int main() { vector<int> a = { 1,2,3,4,5 }; pntarr(a); reverse(a.begin(), a.end()); pntarr(a); }
|
与字符串同理。
此代码输出:
sort()
该函数可让普通数组或容器中的元素按大小排列。本质上是用优化过的快速排序法实现的。
排序时要规定排序规则,默认为从小到大递增排序。
坐标也是左闭右开。
数组
sort(<数组名称>+排序起始坐标,<数组名称>+排序结束坐标,排序规则)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include<iostream> #include<algorithm> using namespace std; void pntarr(int num[], int n) { for (int i = 0; i < n; i++) { cout << num[i] << " "; } cout << endl; } int main() { int a[5] = { 2,1,4,3,5 }; pntarr(a, 5); sort(a, a + 5); pntarr(a, 5); }
|
此代码输出:
容器(vector)
sort(<容器名称>.begin(),<容器名称>.end(),排序规则)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include<iostream> #include<vector> #include<algorithm> using namespace std; void pntarr(vector<int> num) { for (int i = 0; i <num.size(); i++) { cout << num[i]<<" "; } cout << endl; } int main() { vector<int> a = { 2,1,4,3,5 }; pntarr(a); sort(a.begin(), a.end()); pntarr(a); }
|
此代码输出:
排序规则
是一个函数指针。要求是在升序排序时当a(参数一)小于b(参数二)时返回真,反之亦然。
以vector
排序为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include<iostream> #include<vector> #include<algorithm> using namespace std; bool cmp(const int& a, const int& b) { return a > b; } void pntarr(vector<int> num) { for (int i = 0; i < num.size(); i++) { cout << num[i] << " "; } cout << endl; } int main() { vector<int> a = { 2,1,4,3,5 }; pntarr(a); sort(a.begin(), a.end(),cmp); pntarr(a); }
|
cmp()
函数用于指定排序规则,这样就实现了降序排序。
输出结果:
除此之外,还可以用c++自带的一些基于模板的比较大小的函数,如equal_to
、greater
、less
等。
以下是一个实现降序排序的另一种方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include<iostream> #include<vector> #include<algorithm> using namespace std; void pntarr(vector<int> num) { for (int i = 0; i <num.size(); i++) { cout << num[i]<<" "; } cout << endl; } int main() { vector<int> a = { 2,1,4,3,5 }; pntarr(a); sort(a.begin(), a.end(),greater<int>()); pntarr(a); }
|
输出结果: