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.rhkb.cn/news/252770.html

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

相关文章

感悟笔记——2024年2月5日

今日阅读了一篇挺有深度的文章&#xff0c;主要阐述进入职场后的大部分人&#xff0c;是怎么逐渐沦为螺丝钉的?即使起点巨高的优等生&#xff0c;也不可避免。文章指路&#xff1a; 「优等生思维」正在将你变成「螺丝钉」和「老黄牛」从小到大&#xff0c;我一直都是那个「别…

2024最新版MySQL安装使用指南

2024最新版MySQL安装使用指南 Installation and Usage Guide to the Latest Oracle MySQL in 2024 By JacksonML 1. MySQL简介 MySQL是世界上最受欢迎的开源数据库之一。MySQL属于Oracle&#xff08;甲骨文&#xff09;公司的产品&#xff0c;其具有强大的功能&#xff0c;但…

【QT】opcuaServer 的构建

【QT】opcuaServer 的构建 前言opcuaServer实现测试 前言 在博文【opcua】从编译文件到客户端的收发、断连、节点查询等实现 中&#xff0c;我们已经介绍了如何在QT 中创建opucaClient 。在本期的博文中&#xff0c;我们基于之前的部署环境&#xff0c;介绍一下如何构建opcuaS…

对AI原生应用做“逆向”后,我找到了大多数大模型厂商注定失败的原因

大家好&#xff0c;我是卖萌酱。 在一整个2023年对大模型风风火火的流星赶月之后&#xff0c;大模型的竞逐已经来到了“下半场”。应接不暇推出一个又一个大模型已为GPT的技术神话祛魅&#xff0c;不得不说&#xff0c;2024年的大模型市场将更加关注大模型的应用和商业价值。 …

docker入门教程之将应用程序容器化

将应用程序容器化 在本指南的其余部分中&#xff0c;您将使用在 Node.js 上运行的简单待办事项列表管理器。如果您不熟悉 Node.js&#xff0c;请不要担心。本指南不需要任何 JavaScript 经验。 先决条件 您已安装最新版本的 Docker Desktop。您已经安装了 Git 客户端。您可以…

88 SRC挖掘-拿下CNVD证书开源闭源售卖系统

目录 1&#xff0e;开源系统、闭源系统、售卖系统2&#xff0e;如何寻找上述三类系统并进行安全测试3&#xff0e;如何挑简单的入手最快速度获取证书装x演示案例:某开源逻辑审计配合引擎实现通用某闭源审计或黑盒配合引擎实现通用某售卖审计或黑盒配合引擎实现通用 涉及资源&am…

10s初认识多线程创建四种方法

1 继承Thread类 2 实现Runnable接口 3 实现Callable接口 4 多线程池 1-2两方法 10s学会教程网址&#xff1a; http://t.csdnimg.cn/UPy1r 本文简略提及多线程池 -》提前创建多个线程&#xff0c;放在一个“容器”&#xff0c;用时取出&#xff0c;不用即放回池中 优点-》响应…

博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;用户管理 &#xff08;2&#xff09;文章分类管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#…

MySQL查询优化技巧和10个案例展示

优化MySQL查询的实战技巧&#xff1a; **避免使用SELECT ***&#xff1a;只获取需要的列&#xff0c;这样可以减少数据传输量&#xff0c;提高查询效率。使用索引&#xff1a;为查询频繁的列创建索引&#xff0c;可以显著提高查询速度。但请注意&#xff0c;索引并非万能&…

AI新宠Arc浏览器真可以取代Chrome吗?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

缩略图保持加密(TPE)论文

文献: R.Zhao,Y.Zhang,Y.Nan,W.Wen,X.Chai,andR. Lan, “Primitively visually meaningful image encryption: A new paradigm,” Inf. Sci. (Ny), Vol. 613, pp. 628–48, 2022. DOI: 10.1016/j.ins.2022.08.027. (1) 第1行:原始图像 第2行:加密图像 加密的目标: 原始…

MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(1)-后端项目框架搭建

前言&#xff1a; 前面的四个章节我们主要讲解了MongoDB的相关基础知识&#xff0c;接下来我们就开始进入使用.NET7操作MongoDB开发一个ToDoList系统实战教程。本章节主要介绍的是如何快熟搭建一个简单明了的后端项目框架。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战…

Flink cdc3.0动态变更表结构——源码解析

文章目录 前言源码解析1. 接收schema变更事件2. 发起schema变更请求3. schema变更请求具体处理4. 广播刷新事件并阻塞5. 处理FlushEvent6. 修改sink端schema 结尾 前言 上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题&#xff0c;本篇来看下新功能之一的动态变更表结…

设计模式学习笔记04(小滴课堂)

1.创建基础类&#xff1a; 调用它进行类对象的复制&#xff1a; 但是如果属性都是基本数据类型确实像这样很简单&#xff0c;但是如果属性中也包含复杂的数据类型呢&#xff1f; 再去测试一下&#xff1a; 我们发现person1和person2的list属性值的内容是同步的&#xff0c;这显…

探索C语言结构体:编程中的利器与艺术

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 常量与变量 1. 什么是结构体 在C语言中本身就自带了一些数据类型&#x…

浏览器唯一标识(浏览器指纹)fingerprintjs

目标 H5用户在未登录前&#xff0c;经常也需要记录游客身份&#xff0c;便于记录用户操作习惯&#xff0c;给用户推荐相关产品。H5项目是运行在浏览器环境的&#xff0c;浏览器没有提供相关设备ID的信息。很多项目会随机生成一个UUID&#xff0c;并持久化存储在localStorage&a…

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…

基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听长按快捷键addEventListener("keydown", this.keydown);addEventListener("keyup", this.keyup);},destroyed(d) {//移除长按快捷键removeEventListener(&…

【python】绘制春节烟花

一、Pygame库春节烟花示例 下面是一个使用Pygame实现的简单春节烟花效果的示例代码。请注意&#xff0c;运行下面的代码之前&#xff0c;请确保计算机上已经安装了Pygame库。 import pygame import random import math from pygame.locals import *# 初始化pygame pygame.ini…

颐和园龙纹珍宝展亮相,文物预防保护科技护航

在皇家园林颐和园的深处&#xff0c;一场独特的文化盛宴正静静上演。2月1日&#xff0c;“祥龙贺岁—颐和园藏龙纹题材文物特展”在德和园华丽揭幕。此次特展汇聚了66件珍贵文物&#xff0c;包括玉器、瓷器、书画、珐琅、家具等&#xff0c;每一件都是颐和园园藏的瑰宝。这些文…