STL算法(中)

常用排序算法

sort

功能描述:
对容器内元素进行排序
函数原型:
sort(iterator beg, iterator end, _Pred) ;
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// _Pred 谓词

sort属于开发中最常用的算法之一,需熟练掌握  

 代码实现

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
//sort(iterator beg, iterator end, _Pred); 第三个元素谓词可加不加,不加为默认 
using namespace std;
void print(int val){cout<<val<<" ";
}
//bool Greater20(int val,int val2)//再次证明普通函数完全可以替代仿函数,但是其类型要一样,具体参考for_each案例和
count_if案例 
//{
//	return val>val2;
//}
void test01(){vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);//利用sort进行升序sort(v.begin(),v.end());for_each(v.begin(),v.end(),print); cout<<endl;//	改变为降序
//	sort(v.begin(),v.end(),Greater20);sort(v.begin(),v.end(),greater<int>());//内建函数对象 for_each(v.begin(),v.end(),print);//逆向输出//三种输出方法 
} 
int main()
{test01();system("pause");
}

再次证明普通函数完全可以替代仿函数,但是其类型要一样,具体参考for_each案例和count_if案例 

random_shuffle

功能描述:
洗牌 指定范围内的元素随机调整次序
函数原型:
random_shuffle(iterator beg, iterator end) ;
// 指定范围内的元素随机调整次序
// beg 开始迭代器
// end 结束迭代器

//利用洗牌算法打乱顺序
    random_shuffle(v.begin(),v.end());
    
    for_each(v.begin(),v.end(),print());

再加上随机种子实现乱序

代码实现

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
#include<ctime>
using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};void test01(){vector<int>v;for(int i=0;i<10;i++){v.push_back(i);}//利用洗牌算法打乱顺序random_shuffle(v.begin(),v.end());for_each(v.begin(),v.end(),print());} 
int main()
{srand((unsigned int)time(NULL));//经典随机种子 test01();system("pause");
}
总结:random_shuffle洗牌算法比较实用,使用时记得加随机数种子

merge

功能描述:
两个容器元素合并,并存储到另一容器中
函数原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) ;
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的  合并后还是有序序列 
// beg1 容器 1 开始迭代器 // end1 容器 1 结束迭代器 // beg2 容器 2 开始迭代器 // end2 容器 2 结束迭代器 //dest 目标容器 开始 迭代器

代码实现

#include <iostream>
#include<vector>
#include<algorithm>
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的
// beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
//dest 目标容器开始迭代器
//有意思是合并后还是有序序列 
using namespace std;
class print{public:void operator()(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+5);}//目标容器vector<int>vTarget;//此时要给目标容器分配空间vTarget.resize(v1.size()+v2.size()); merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());for_each(vTarget.begin(),vTarget.end(),print()); 
} 
int main()
{test01();system("pause");
}

实现

如图所示   合并后还是有序序列 

reverse

功能描述:
将容器内元素进行反转
函数原型:
reverse(iterator beg, iterator end) ;
// 反转指定范围的元素
// beg 开始迭代器  //end  结束迭代器

代码实现 

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);cout<<"反转前:"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;cout<<"反转后:"<<endl;reverse(v.begin(),v.end());for_each(v.begin(),v.end(),print());	
} 
int main()
{test01();system("pause");
}

常用拷贝和替换算法

copy

vector<int>v2(v1);//也可以直接拷贝,不用算法赋空间   也可等号赋值   (具体见前面的容器总结)

功能描述:
容器内指定范围的元素拷贝到另一容器中
函数原型:
copy(iterator beg, iterator end, iterator dest) ;
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// dest 目标起始迭代器

 

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}
//	vector<int>v2(v1);//也可以直接拷贝,不用算法   也可等号赋值 vector<int>v2;//设置内存空间 v2.resize(v1.size());copy(v1.begin(),v1.end(),v2.begin());for_each(v2.begin(),v2.end(),print());} 
int main()
{test01();system("pause");
}

replace

功能描述:
将容器内指定范围的旧元素修改为新元素
函数原型:
replace(iterator beg, iterator end, oldvalue, newvalue) ;
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素

简单,没什么说的,直接放代码

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
class print{public:void operator()(int val){cout<<val<<" ";}
};
//replace(iterator beg, iterator end, oldvalue, newvalue);
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素
void test01(){vector<int>v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(50);v.push_back(20);v.push_back(60);v.push_back(20);v.push_back(70);cout<<"替换前"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;//将20替换成2000replace(v.begin(),v.end(),20,2000); cout<<"替换后"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;
} 
int main()
{test01();system("pause");
}

 

replace_if

功能描述 :
将区间内 满足条件 的元素,替换成指定元素
函数原型:
replace_if(iterator beg, iterator end, _pred, newvalue) ;
// 按条件替换元素,满足条件的替换成指定元素
// beg 开始迭代器
// end 结束迭代器
// _pred 谓词   (bool)
// newvalue 替换的新元素

 代码如下

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
using namespace std;
//谓词  返回bool类型
class Greater30{public:bool operator()(int val){return val>=30;}
};class print//仿函数 
{public:void operator()(int val){cout<<val<<" ";}
};
void test01(){vector<int>v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(50);v.push_back(20);v.push_back(60);v.push_back(20);v.push_back(70);cout<<"替换前"<<endl;for_each(v.begin(),v.end(),print());cout<<endl;//将大于等于30替换为3000replace_if(v.begin(),v.end(),Greater30(),3000);//34为替换条件和替换值	for_each(v.begin(),v.end(),print());cout<<endl;} 
int main()
{test01();system("pause");
}

swap

功能描述:
互换两个容器的元素
函数原型:
swap(container c1, container c2) ;
// 互换两个容器的元素
// c1 容器 1
// c2 容器 2
直接写两个容器
代码如下
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件using namespace std;
void print(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+100);	} cout<<"交换前:"<<endl;for_each(v1.begin(),v1.end(),print);cout<<endl;for_each(v2.begin(),v2.end(),print);cout<<endl;cout<<"-----------------------------------"<<endl;cout<<"交换后:"<<endl;swap(v1,v2);for_each(v1.begin(),v1.end(),print);cout<<endl;for_each(v2.begin(),v2.end(),print);cout<<endl;
}
int main()
{test01();system("pause");
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/457546.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

报错信息 VSCode无法连接远程服务器&#xff0c;终端一直提醒&#xff1a; [22:46:01.906] > Waiting for server log... [22:46:01.936] > Waiting for server log... [22:46:01.951] > [22:46:01.967] > Waiting for server log... [22:46:01.982] > [22:…

从零开始手写mmo游戏从框架到爆炸(七)— 消息封装

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 上一篇&#xff0c;我们初步把消息handler 注册到了服务中&#xff0c;在进行后续工作之前我们需要再做一些准备工作。 第一&#xff1a;把之前自己管理的bean放到spring中…

微信小程序(三十七)选项点击高亮效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.选择性渲染类 2.以数字为需渲染内容&#xff08;数量&#xff09; 源码&#xff1a; index.wxml <view class"Area"><!-- {{activeNumindex?Active:}}是选择性添加类名进行渲染 -->&l…

RCS系统之:机器人状态

在设计RCS系统平台时&#xff0c;机器人总共设计状态有&#xff1a; 离线模式&#xff1b; 如图&#xff0c;18号机器人呈灰黑色&#xff0c;表示机器人没有上电状态 工作模式&#xff1b; 如图&#xff0c;10号机器人成绿色&#xff0c;表示机器人处于工作模式&#xff0c;等…

关于TDSQL(MySQL)的简单知识分享

0. 前言 最近在系统改造过程中&#xff0c;接触到了国产分布式数据库TDSQL&#xff0c;记录一下关于TDSQL的部分知识点。 1. TDSQL简介 TDSQL是腾讯推出的一款兼容MySQL的自主可控、高一致性分布式数据库产品。 1.1 TDSQL优点&#xff1a; 数据强一致性高性能低成本线性水…

前端JavaScript篇之for...in和for...of的区别

目录 for...in和for...of的区别for...in循环for...of循环区别&#xff1a; for…in和for…of的区别 在JavaScript中&#xff0c;for...in和for...of是两种常用的循环语法&#xff0c;它们有着明显的区别和适用场景。 for...in循环 for...in循环用于遍历一个对象的所有可枚举…

引入echarts环形图及显示后端数据

实现效果&#xff1a; 1.下载echarts 并引用 npm install echarts --save 或 pnpm install -S echarts 项目中引用&#xff1a; 在项目main.ts中 import * as echarts from "echarts"; //引入echarts 3.页面中使用 <div id"main" class&quo…

Topaz Photo AI for Mac v2.3.1 补丁版人工智能降噪软件无损放大

想要将模糊的图片变得更加清晰&#xff1f;不妨试试Topaz Photo AI for Mac 这款人工智能、无损放大软件。Topaz Photo AI for Mac 一款强大的人工智能降噪软件&#xff0c;允许用户使用复杂的锐化算法来提高图像清晰度&#xff0c;还包括肖像编辑选项&#xff0c;如面部重塑、…

C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法

目录 一、使用的方法 1.使用Array.Copy方法 2.Copy(Array, Int32, Array, Int32, Int32) 3. 使用自定义的方法 二、实例 1.示例1&#xff1a;使用Array.Copy方法 2.示例2&#xff1a;使用自定义的方法 一、使用的方法 1.使用Array.Copy方法 首先定义了一个名为InsertAr…

Mysql大表添加字段失败解决方案

背景 最近遇到一个问题&#xff0c;需要在user用户表千万级别数据中添加两个字段&#xff0c;发现老是加不上去&#xff0c;一直卡死。表数据量不仅大&#xff0c;而且是一个热点表&#xff0c;访问频率特别高&#xff0c;而且该表的访问是在一个大事务中。加字段的时候一直在…

人工智能福利站,初识人工智能,图神经网络学习,第三课

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统

代码下载&#xff1a; 基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统.zip资源-CSDN文库 1.研究的背景 水下场景目标检测是水下机器人、水下无人机和水下监控等领域中的重要任务之一。然而&#xff0c;由于水下环境的复杂性和特殊性&#xff0c;水下目标检测面临着许多挑…