STL常用排序算法、替换算法、拷贝算法(20221207)

news2024/11/19 11:26:07

STL的常用算法

概述:

算法主要是由头文件<algorithm> <functional> <numeric> 组成。

<algorithm>是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历等等;

<functional>定义了一些模板类,用于声明函数对象;

<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。

三、排序算法

算法简介:
sort //对容器内元素进行排序

random_shuffle  //洗牌 指定范围内元素随机调整顺序

merge //容器元素合并 并存储到另一容器中

reverse  //反转指定范围内容器

1、random_shuffle(iterator beg,iterator end);

指定范围内的元素随机调整次序;算法实用,但使用时注意加随机数种子才能真正的随机打乱

void myPrint(int val)

{

    cout << val << " ";

}



void test01()

{

    //加入随机数种子,使每次打乱顺序随机

    srand((unsigned int)time(NULL));

    vector<int>V1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //原顺序

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

   //利用洗牌算法打乱顺序

    random_shuffle(V1.begin(), V1.end());

    //遍历打印输出

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

}

2、merge

两个容器元素合并,并存储到另一容器中

注意两个容器必须是有序的

merge(iterator beg1,iterator end1, iterator beg2,iterator end2,iterator dest);

dest:目标容器迭代器的begin()

void myPrint(int val)

{

    cout << val << " ";

}



void test01()

{

    //加入随机数种子,使每次打乱顺序随机

    srand((unsigned int)time(NULL));

    vector<int>V1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //原顺序

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

   //利用洗牌算法打乱顺序

    random_shuffle(V1.begin(), V1.end());

    //遍历打印输出

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

}

3、reverse(iterator beg,iterator end);

将指定范围内的元素反转

四、常用的拷贝和替换算法

copy

replace

replace_if

swap

1、copy(iterator beg,iterator end,iterator dest);

容器指定范围内的元素拷贝到另一容器中。

dest:目标起始迭代器

2、replace(iterator beg,iterator end,oldvalue,newvalue);

将容器内指定区间内旧元素替换成新元素  满足oldvalue的元素都被替换掉

void myPrint(int val)

{

    cout << val << " ";

}



class Print {

public:

    void operator()(int val)

    {

        cout << val << " ";

    }

};

void test04()

{

    vector<int>V1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //遍历 替换前

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

    replace(V1.begin(),V1.end(),30,3000);//30替换成3000

    for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象

    cout << endl;

}

3、replace_if(iterator beg,iterator end,_pred,newvalue);

//按条件替换元素 满足条件的替换成指定元素

_pred为谓词

class Greater30 {

public:

    bool operator()(int val)

    {

        return val > 30;

    }



};



void test05()

{

    vector<int>V1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    //遍历 替换前

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

    replace_if(V1.begin(), V1.end(), Greater30(), 3000);//将大于30的元素替换成3000  Greater30()匿名对象

    for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象

    cout << endl;

}

replace_if按条件查找,可以利用仿函数灵活筛选满足的条件

4、swap

互换两个容器的元素

swap(container c1,container c2);

注意容器c1、c2需要满足相同结构类型

void test07()

{

    vector<int>V1;

    V1.push_back(10);

    V1.push_back(20);

    V1.push_back(30);

    V1.push_back(40);

    V1.push_back(50);

    vector<int>V2;

    V2.push_back(15);

    V2.push_back(24);

    V2.push_back(37);

    V2.push_back(48);

    V2.push_back(59);

    V2.push_back(69);

    V2.push_back(79);

    V2.push_back(89);

    //遍历 交换前

    for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint

    cout << endl;

    swap(V1, V2);//交换

    for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象

    cout << endl;

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Linux运维实战:Centos7.6一键离线部署mongodb4.2.23副本集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&#xff0c;而作为基础组件中的mongodb针对不同的客户环境需要多次部署&#xff0c;作为一个运维工程师&#xff0c;提升工作效率也是工作中的重要一环。所以我觉得有必要针对mongodb4…

window+deepin双系统安装

说明 参考教程&#xff1a;https://baijiahao.baidu.com/s?id1662960328855347503 特别注意&#xff0c;最好用最新的PE工具&#xff0c;我用的 微PE。因为我弄过一次全盘安装&#xff0c;导致整个硬盘在PE工具中的diskgenius无法识别&#xff0c;最终为U盘安装最新版PE工具后…

中国唯一代表!阿里第三次当选Java全球管理组织最高管理席位

12月7日消息&#xff0c;近日&#xff0c;Java全球管理组织JCP披露了最高执行委员会&#xff08;JCP-EC&#xff09;新成员名单&#xff0c;作为唯一中国代表&#xff0c;阿里巴巴再次连任&#xff0c;任期两年。这是阿里连续三次入选JCP最高管理席位&#xff0c;代表着中国技术…

SpringBoot全局异常@ExceptionHandler无法精确匹配问题分析

这个是我的全局异常处理类&#xff0c;以new ThirdException&#xff08;JSON.toJSONString(obj)&#xff09;形式抛出了这个自定义异常&#xff0c;不管从最底层的方法抛出上层不抛&#xff0c;还是从controller的入口开始都抛出&#xff0c;均无法精确匹配。下面分别是自定义…

云原生底座之上,企业如何借力领跑数字化转型?

导语 | 随着数字化转型的加速&#xff0c;越来越多企业选择“乘云而上”&#xff0c;把云战略提升到了全新的高度&#xff0c;并逐步朝着多云架构加速演进。云原生架构的持续迭代&#xff0c;使得云原生技术的应用层出不穷&#xff0c;无论是互联网公司&#xff0c;还是银行、政…

阿里高工熬夜18天码出Java150K字面试宝典,却遭Github全面封杀

大家都知道&#xff0c;现在的Java面试是越来越难了&#xff01;主要原因无非是两个&#xff1a; 随着Java这个行业的兴起&#xff0c;不管是在家待业的、对自己现在工作不满意的、大学选错专业的、缺钱的、想自己学的等等这些人绝大部分都是选择了去学习Java&#xff01;大量人…

(附源码)SSM驾校考试车预约管理系统 毕业设计

SSM驾校考试车预约管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中…

数据库主从复制,读写分离,分库分表理解 (数据库架构演变)

主从复制 主从复制, 主要是针对MySQL数据库的高可用性, 容灾性上面. 是叫做高可用性? 高可用性可以简单的理解为容灾性, 稳定性, 针对故障&#xff0c;风险情况下的处理, 备案, 策略. 指系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度 高可用性通常…

FFmpeg手撕视频(Android端)

前言 FFmpeg是非常强大的音视频处理工具&#xff0c;我们可以使用它来处理视频合成、剪辑、加特效等等操作。 官方文档至上 FFmpeg的官方文档 FFmpeg的官方文档命令真的是太多太多&#xff0c;而且都是英文&#xff0c;感觉精通完这些命令&#xff0c;都够学一门新语言了&#…

SpringSecurity实现登录和自定义权限认证

介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean&#xff0c;充分利用了Spring IoC&#xff0c;DI和AOP&#xff08;面向切面编程&#xff09;功能&#xff0c;为应用系…

怎么看l2接口十档行情?

怎么看l2接口十档行情&#xff1f;打开任意个股&#xff0c;在盘口即可查看买一至买十&#xff0c;卖一至卖十。Level行情1只能看五档报价&#xff0c;但是五档报价看起来很平静&#xff0c;但是主力很可能会在五档报价之外悄悄布局。使用Level2接口&#xff0c;你可以看到10档…

python制作刮刮乐惊喜揭秘呀~【趣味代码】

前言 大家早好、午好、晚好吖 ❤ ~ 在今天&#xff0c;在我百般无聊的时候&#xff0c;突然发现一存货 于是&#xff0c;我把从犄角旮旯里翻出来的代码一运行 嘿&#xff0c;真不错~那在这里就分享给大家 素材 首先我们准备一些图片以及一首下载好的音乐&#xff08;游戏音…

C++ 数学与算法系列之认识格雷码

1. 前言 程序中所涉及到的任何数据&#xff0c;计算机底层均需转换成二进制数值后方可存储&#xff0c;这个过程也称为编码。反之&#xff0c;把底层二进制数据转换成应用数据称为解码&#xff0c; 不同的数据类型需要不同的编&#xff08;解&#xff09;码方案&#xff0c;如…

论文投稿指南——中国(中文EI)期刊推荐(第2期)

&#x1f680; EI是国际知名三大检索系统之一&#xff0c;在学术界的知名度和认可度仅次于SCI&#xff01;&#x1f384;&#x1f388; 【前言】 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。其中&#xf…

基于jsp+ssm闲置图书分享平台系统-计算机毕业设计

项目介绍 本闲置图书管理系统主要包括系统图书交换模块、图书分享管理模块、图书借阅管理模块、新闻公告管理模块、图书类别管理、图书信息管理、登录模块、和退出模块等多个模块,采用目前最流行的B/S结构和java中流行的MVC三层设计模式和eclipse编辑器、MySQL 数据库设计并实…

代码提速100倍,怎么实现的?

众所周知&#xff0c;Python的简单和易读性是靠牺牲性能为代价的 尤其是在计算密集的情况下&#xff0c;比如多重for循环。不过现在&#xff0c;大佬胡渊鸣说了&#xff1a; 只需import 一个叫做“Taichi”的库&#xff0c;就可以把代码速度提升100倍&#xff01; 不信&…

VTK - vtkPolyData数据的Remesh

欢迎加入我的VTK社区 雪易VTK社区-CSDN社区云 前言&#xff1a;在研究3-matic软件中smooth Edge和Local Smoothing功能时&#xff0c;先对数据的网格进行了重新的划分&#xff0c;即3-matic软件中的Remesh功能。本博文主要针对Remesh进行展开。 目录 网格质量 vtkMeshQuali…

【JavaScript】ESLint 深入浅出

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 初体验安装lint配置.eslintrc.js忽略文件package.json中添加eslint脚本2️⃣ vscode中使用插件安装作用3️⃣ 规避报错问题行添加注释问题文件开头添加注释修改配置文件.eslintrc.js4️⃣ 常见错误汇总Cannot read property nam…

站在巨人的肩膀上,用Node+ChatGPT模块实现一个接口

目录 前言 准备工作 起步 写在最后 前言 蹭一下最近比较火的人工智能ChatGPT的热度&#xff0c;最近看到许多小伙伴都在调戏ChatGPT&#xff0c;看到这我就坐不住了&#xff0c;这种事怎么能少了我&#xff0c;于是闲&#xff08;划&#xff09;暇&#xff08;水&#xff0…

什么事Jupyter Notebook?

Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 简而言之&#xff0c;Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也…