【STL——常用排序、拷贝与替换算法】
引入
以下常用算法均采用以下预处理指令组
#pragma once
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
常用排序算法
sort
功能描述:对容器内元素进行排序
函数原型:
sort(iterator beg, iterator end, _Pred);
_Pred可有可无,没有时默认升序,有时就按_Pred的规则进行排序。
- 定义用于降序排列的类
template<typename T>
class order {
public:bool operator()(T a,T b) {return a>b; //降序排列}
};
- 功能实现
void test() {vector <int>v = { 9,12,31,44,89,1,5 };sort(v.begin(), v.end()); //升序排列for_each(v.begin(), v.end(), print01);cout << endl;sort(v.begin(), v.end(),order<int>()); //不要忘记order的参数列表for_each(v.begin(), v.end(), print01);cout << endl;
}void print01(int val) {cout << val << " ";
}
random_shuffle
功能描述:洗牌 指定范围内的元素随机调整次序
函数原型:
random_shuffle(iterator beg, iterator end);
指定范围内的元素随机调整次序
注意:如果不加种种子和随机种子的语句以及时钟头文件,会实现随机次序,但仅调整一次;加上之后每次编译都会出现新的排列顺序。
void test() {srand((unsigned int)time(NULL));vector<int> v = { 1,2,3,4,5,6,7 };random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), print01);
}void print01(int val) {cout << val << " ";
}
merge
功能描述:两个容器元素((必须有序排列)合并,并存储到另一个容器中,合并后的容器元素也有序。
函数原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
将第一个容器的[beg1,end1)以及第二个容器的[beg2,end2)合并,并存储到dest中,但语句中应写明dest存储的位置。
void test() {vector<int> v1 = { 1,3,5,7,9 };vector<int> v2 = { 2,4,6,8 };vector<int> v3 = {33,67};v3.resize(v1.size() + v2.size());merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());for_each(v3.begin(), v3.end(), print01);
}void print01(int val) {cout << val << " ";
}
reverse
功能描述:将容器内元素进行反置
函数原型:
reverse(iterator beg, iterator end);
void test() {vector<int> v1 = { 1,3,5,7,9 };cout << "反置前:" << endl;for_each(v1.begin(), v1.end(), print01);cout << endl;cout << "反置后:" << endl;reverse(v1.begin(), v1.end());for_each(v1.begin(), v1.end(), print01);
}void print01(int val) {cout << val << " ";
}
常用拷贝与替换算法
copy
功能描述:容器内指定范围的元素拷贝到另一个容器中
函数原型:
copy(iterator beg, iterator end, iterator dest);
将开始迭代器到结束迭代器之间的元素拷贝到目标容器dest中
void test() {vector<int> v1 = { 1,3,5,7,9 };vector<int>v2;v2.resize(v1.size());copy(v1.begin(), v1.end(), v2.begin());for_each(v2.begin(), v2.end(), print01);
}void print01(int val) {cout << val << " ";
}
replace
功能描述:将容器内指定范围的旧元素替换为新元素
函数原型:
replace(iterator beg, iterator end, oldvalue, newvalue);
void test() {vector<int> v1 = {46,22,44,11,46};replace(v1.begin(), v1.end(), 46, 99); //将[begin,end)区间的46都换成99for_each(v1.begin(), v1.end(), print01);//输出:99,22,44,11,99
}void print01(int val) {cout << val << " ";
}
replace_if
功能描述:将区间内满足条件的元素,替换成指定元素
函数原型:
replace_if(iterator beg, iterator end, _pred, newvalue);
按条件替换元素,满足条件_pred的替换成指定元素newvalue
- 定义条件
class Greater01{
public:bool operator()(int val) {return val > 40;}
};
- 功能实现
void test() {vector<int> v1 = {46,11,44,11,46};cout << "替换前: ";for_each(v1.begin(), v1.end(), print01);cout << endl;//大于40的换成1000replace_if(v1.begin(), v1.end(), Greater01(), 1000);cout << "替换后: ";for_each(v1.begin(), v1.end(), print01);}void print01(int val) {cout << val << " ";
}
