文章目录
- STL常用算法——排序算法
- 1、sort()
- 2、random_shuffle()
- 3、merge()
- 4、reverse()
STL常用算法——排序算法
1、sort()
sort():对容器或普通数组中范围内的元素进行排序,默认进行升序排序,也可以自定义排序规则。
sort() 函数只对 array、vector、deque 这 3 个容器提供支持。
sort() 函数在对自定义的类对象实现排序时,需要在该类的内部提供移动构造函数和移动赋值运算符。
函数原型:该函数有以下两种语法格式
sort (iterator beg,iterator end);
sort (iterator beg,iterator end, Compare comp);
参数说明:
- beg 开始迭代器
- end 结束迭代器
- comp 标准库提供的排序规则(如
greater<T>
);或普通函数以及函数对象接收的自定义的排序规则
默认排序和标准库提供的排序
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
void myPrint(int val) {
cout << val << " ";
}
void test01() {
vector<int> v{1,4,5,3,2};
sort(v.begin(), v.end());
for_each(v.begin(), v.end(), myPrint);
cout << endl;
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), myPrint);
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
自定义排序规则
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
void myPrint(int val) {
cout << val << " ";
}
bool mycomp(int i, int j) {
return (i < j);
}
class mycomp2 {
public:
bool operator() (int i, int j) {
return (i < j);
}
};
void test01() {
vector<int> v{ 32, 71, 12, 45, 26, 80, 53, 33 };
sort(v.begin(), v.end(), mycomp);
for_each(v.begin(), v.end(), myPrint);
cout << endl;
sort(v.begin(), v.end(), mycomp2());
for_each(v.begin(), v.end(), myPrint);
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
2、random_shuffle()
random_shuffle():指定范围内的元素随机调整次序
函数原型:
random_suffle(iterator beg,iterator end);
参数说明:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<ctime>
void myPrint(int val) {
cout << val << " ";
}
void test01() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
for_each(v.begin(), v.end(), myPrint);
cout << endl;
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), myPrint);
cout << endl;
}
int main() {
srand((unsigned int)time(NULL));
test01();
system("pause");
return 0;
}
3、merge()
合并排序,merge() 函数用于将 2 个有序序列合并为 1 个有序容器,前提是这 2 个有序容器的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序容器,其排序规则也和这 2 个有序容器要相同。
函数原型:该函数有以下两种格式
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest, Compare comp);
参数说明:
- beg1 容器1开始迭代器
- end1 容器1结束迭代器
- beg2 容器2开始迭代器
- end2 容器2结束迭代器
- dest 目标容器开始迭代器,为最终生成的新有序序列指定存储位置
- comp 用于自定义排序规则
默认排序
void myPrint(int val) {
cout << val << " ";
}
void test01() {
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i * 2);
}
vector<int> v3;
v3.resize(v1.size() + v2.size());
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
for_each(v3.begin(), v3.end(), myPrint);
cout << endl;
}
自定义排序规则
void myPrint(int val) {
cout << val << " ";
}
bool mycomp(int i, int j) {
return (i > j);
}
class mycomp2 {
public:
bool operator() (int i, int j) {
return (i > j);
}
};
void test01() {
vector<int> v1;
vector<int> v2;
for (int i = 10; i > 0; i--) {
v1.push_back(i);
v2.push_back(i * 2);
}
vector<int> v3;
v3.resize(v1.size() + v2.size());
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp);
for_each(v3.begin(), v3.end(), myPrint);
cout << endl;
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin(), mycomp2());
for_each(v3.begin(), v3.end(), myPrint);
cout << endl;
}
4、reverse()
reverse()函数:将容器指定范围内的元素进行反转
函数原型:
reverse(iterator beg,iterator end);
参数说明:
void myPrint(int val) {
cout << val << " ";
}
void test01() {
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
}
reverse(v1.begin(), v1.end());
for_each(v1.begin(), v1.end(), myPrint);
cout << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)