当前位置: 首页 > article >正文

【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); 
  1. 返回目标容器最后一个元素的迭代器地址
  2. 求交集的两个集合必须为有序序列
  3. 目标容器开辟空间需要从两个容器中取最小值

代码示例 

#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); 
  1. 返回目标容器最后一个元素的迭代器地址
  2. 两个集合必须为有序序列
  3. 目标容器开辟空间需要两个容器相加

两集合的差集:set_difference

  • set_difference(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest); 
  1. 返回目标容器最后一个元素的迭代器地址
  2. 两个集合必须为有序序列
  3. 目标容器开辟空间需要两个容器的较大值

http://www.kler.cn/a/461688.html

相关文章:

  • [Qt] Qt介绍 | 搭建SDK
  • 【面试】后端开发面试中常见数据结构及应用场景、原理总结
  • node.js之---内置模块
  • Spring源码分析之事件机制——观察者模式(二)
  • HTTP Scheme 通常指的是在 URL 中用于指定使用 HTTP 协议的方案(scheme)
  • Windows系统提示ffmpeg.dll丢失怎么解决?
  • 【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
  • node.js之---集群(Cluster)模块
  • 最新版Chrome浏览器加载ActiveX控件之CFCA安全输入控件
  • 设置虚拟机设备的dp和pt
  • 07-ArcGIS For JavaScript--隐藏参数qualitySettings(memory和lod控制)
  • DataV数据可视化
  • 【2025 Rust学习 --- 09 特型和泛型】
  • C语言:位段
  • 【2024年-6月-7日-开源社区openEuler实践记录】探索 oec - hardware:硬件适配与管理的开源利器
  • Android实现队列出入队测试
  • 从自动化到大模型,王培东用实践搭建AI成长阶梯,登上ACL舞台丨社区星风采
  • pytorch 计算图中的叶子节点介绍
  • 我在成都教人用Flutter写TDD(补充)——关于敏捷教练
  • 用户界面的UML建模08
  • 修改r包源代码 ctrl+鼠标点击函数,进入函数内部getgeo 源码
  • 基于SpringBoot和Leaflet的全球机场空间分布可视化实战
  • 蓝桥杯JAVA刷题--001
  • 卸载wps后word图标没有变成白纸恢复
  • PyTorch快速入门教程【小土堆】之损失函数与反向传播
  • 在 IntelliJ IDEA 中开发 GPT 自动补全插件