【C++】22___STL常用算法
目录
一、常用遍历算法
二、常用查找算法
2.1 find
2.2 其它查找算法
三、常用排序算法
3.1 sort
3.2 其它排序算法
四、拷贝 & 替换
4.1 copy
4.2 其它算法
五、常用的算数生成算法
5.1 accumulate
5.2 fill
六、常用集合算法
6.1 set_intersection
6.2 其它算法
概述:
- 算法主要是由头文件<algorithm> 、<functional> 、<numeric>组成
- <algorithm>是所有SSTL头文件中最大的一个,范围涉及到比较、交换、查找等等。
- <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
- <functional>定义了一些模板类,用以声明函数对象
一、常用遍历算法
- for_each() //遍历容器
- transform //搬运容器到另一个容器中
for_each()代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print1(int var){
cout<<var<<" ";
}
class print2{
public:
void operator()(int var){
cout<<var<<" ";
}
};
void test(){
vector<int>v;
for(int i=0;i<10;i++){
v.push_back(i);
}
for_each(v.begin() , v.end() , print1);
cout<<endl;
for_each(v.begin() , v.end() , print2());
cout<<endl;
}
int main(){
test();
return 0;
}
transform代码示例
函数原型:
- transform(iterator beg1 , iterator end1 , iterator beg2 , _func);
- //beg1源容器开始迭代器
- //end1源容器结束迭代器
- //beg2目标容器开始迭代器
- //_func 函数或者函数对象
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
class re{
public:
int operator()(int var){
return var;
}
};
class print{
public:
void operator()(int var){
cout<<var<<" ";
}
};
void test(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
vector<int>v2;
v2.resize(v1.size());
transform(v1.begin() , v1.end() , v2.begin() ,re());
for_each(v2.begin() , v2.end() , print());
}
int main(){
test();
return 0;
}
二、常用查找算法
简介:
- find //查找元素
- find_if //按条件查找元素
- adjacent_find //查找相邻重复元素
- binary_search //二分查找法
- count //统计元素个数
- count_if //按条件统计元素个数
2.1 find
函数原型:
- find(interator beg , iterator end , value);
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
class person{
public:
person(string name , int age){
this->m_Name = name;
this->m_Age = age;
}
bool operator==(const person&p){
if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){
return true;
}else{
return false;
}
}
public:
string m_Name;
int m_Age;
};
void test1(){
vector<int>v1;
for(int i=0;i<10;i++){
v1.push_back(i);
}
vector<int>::iterator it = find(v1.begin() , v1.end() , 4);
if(it != v1.end()){
cout<<"找到了:"<<*it<<endl;
}else{
cout<<"没找到"<<endl;
}
}
void test2(){
vector<person>v2;
person p1("a",18);
person p2("b",19);
person p3("c",20);
person p4("d",21);
v2.push_back(p1);
v2.push_back(p2);
v2.push_back(p3);
v2.push_back(p4);
person pp("c",20);
vector<person>::iterator it = find(v2.begin() , v2.end() , pp);
if(it == v2.end()){
cout<<"没找到"<<endl;
}else{
cout<<"找到了:"<<it->m_Name<<" "<<it->m_Age<<endl;
}
}
int main(){
test1();
test2();
return 0;
}
2.2 其它查找算法
按条件查找:find_if
- find_if(iterator beg , iterator end , _Pred); //按值查找元素,找到返回指定位置迭代器;找不到返回结束迭代器位置。
查找相邻重复元素:adjacent_find
- adjacent_find(iterator beg , iterator end); //查找相邻重复元素,返回相邻元素的第一个位置的迭代器。
查找指定元素是否存在:binary_search
- bool binary_search(iterator beg , iterator eng , value); //查找指定的元素,查到返回true、否则返回false。 注:在无序序列中不可用
统计元素个数:count
- count(iterator beg , iterator end , value); //统计元素出现次数
按条件统计元素个数:count_if
- count_if(iterator beg , iterator end , _Pred); //按条件统计元素个数
三、常用排序算法
简介:
- sort //对容器内元素进行排序
- random_shuffle //指定范围内的元素随机调整次序
- merge //容器元素合并,并存储到另一个容器中
- reverse //反转指定范围的元素
3.1 sort
函数原型:
- sort(iterator beg , iterator end , _Pred);
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print(int var){
cout<<var<<" ";
}
void test(){
vector<int>v;
v.push_back(10);
v.push_back(50);
v.push_back(20);
v.push_back(30);
v.push_back(40);
sort(v.begin() , v.end() );//默认升序
for_each(v.begin() , v.end() , print);
sort(v.begin() , v.end() , greater<int>());//降序
cout<<endl;
for_each(v.begin() , v.end() , print);
}
int main(){
test();
return 0;
}
3.2 其它排序算法
洗牌算法:random_shuffle
- random_shuffle(iterator beg , iterator end); //指定范围内的元素随机调整次序
两个容器合并,并存储到另一个容器中:merge
- merge(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest); //两个容器必须是有序的,且合并后仍是有序的
容器内元素进行反转:reverse
- reverse(iterator beg , iterator end);
四、拷贝 & 替换
简介:
- copy //容器内指定范围的元素拷贝到另一容器中
- replace //将容器内指定范围的旧元素修改为新元素
- replace_if //容器内指定范围满足条件的元素替换为新元素
- swap //互换两个容器的元素
4.1 copy
函数原型:
- copy(iterator beg , iterator end , iterator dest); //容器内指定范围的元素拷贝到另一容器中
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print(int var){
cout<<var<<" ";
}
void test(){
vector<int>v;
v.push_back(12);
v.push_back(13);
v.push_back(14);
vector<int>v2;
v2.resize(v.size());
copy(v.begin() , v.end() , v2.begin());
for_each(v2.begin() , v2.end() , print);
cout<<endl;
}
int main(){
test();
return 0;
}
4.2 其它算法
将容器内指定范围的旧元素修改为新元素:replace
- replace(iterator beg , iterator end , oldvalue , newvalue);
将区间满足条件元素替换为指定元素:replace_if
- replace_if(iterator beg , iterator end , _pred , newvalue);
互换两个容器的元素:swap
- swap(container c1 , container c2);
五、常用的算数生成算法
算法简介:
- accumulate //计算容器元素累计总和
- fill //向容器中添加元素
5.1 accumulate
函数原型:
- accumulate(iterator beg , iterator end , value); //需包含头文件#include<numeric> , 参数三为起始的累加值
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
void test(){
vector<int>v;
for(int i=0;i<10;i++){
v.push_back(i);
}
int num = accumulate(v.begin() , v.end() , 0);
cout<<num<<endl;
}
int main(){
test();
return 0;
}
5.2 fill
函数原型:
- fill(iterator beg , iterator end , value);
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print(int var){
cout<<var<<" ";
}
void test(){
vector<int>v;
v.resize(10);
fill(v.begin() , v.end() , 100);
for_each(v.begin() , v.end() , print);
}
int main(){
test();
return 0;
}
六、常用集合算法
算法简介:
- set_intersection //求两个容器的交集
- set_union //并集
- set_difference //差集
6.1 set_intersection
函数原型:
- set_intersection(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);
- 返回目标容器最后一个元素的迭代器地址
- 求交集的两个集合必须为有序序列
- 目标容器开辟空间需要从两个容器中取最小值
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print(int var){
cout<<var<<" ";
}
void test(){
vector<int>v1;
vector<int>v2;
for(int i=0;i<10;i++){
v1.push_back(i);
v2.push_back(i+5);
}
vector<int>vT;
vT.resize( min(v1.size() , v2.size()) );
vector<int>::iterator END = set_intersection(v1.begin() , v1.end() , v2.begin() , v2.end() , vT.begin());
for_each( vT.begin() , END , print);
}
int main(){
test();
return 0;
}
6.2 其它算法
两集合的并集:set_union
- set_union(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);
- 返回目标容器最后一个元素的迭代器地址
- 两个集合必须为有序序列
- 目标容器开辟空间需要两个容器相加
两集合的差集:set_difference
- set_difference(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);
- 返回目标容器最后一个元素的迭代器地址
- 两个集合必须为有序序列
- 目标容器开辟空间需要两个容器的较大值