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

c++ STL--算法,迭代器,容器适配器,仿函数

c++ STL–算法,迭代器,容器适配器,仿函数

一.算法

1.使用的头文件为

#include<algorithm>//以这个头文件为主
#include<numeric>

2.关于算法一些功能的使用

1.遍历

void fun1(int x) {cout << x << "   ";
}list<int> lst{ 1,2,3,4,5 };
::for_each(lst.begin(), lst.end(), &fun1); cout << endl;//进行遍历,这里是遍历整个容器,左闭右开,第一个和第二个参数都是迭代器,第三个参数为一个函数的地址(里面写具体要干什么,比如输出)

2.找某元素出现的次数

vector<int> vet{ 1,4,5,2,4,6,9,4 };
cout << ::count(vet.begin(), vet.end(), 4) << endl;//左闭右开,这里是在整个容器中找,第一个和第二个参数都是迭代器,第三个参数是要找的元素

3.比较

vector<int> vet1{ 1,4,5 };
vector<int> vet2{ 1,4,5,6 };
cout << boolalpha /* 这个可以要输出的0变为false输出,把要输出的1变为true输出*/<< ::equal(vet1.begin(), vet1.end(), vet2.begin()) << endl;//第一个和第二个参数是第一个的范围,第三个参数是第二个的起点

4.找某个元素出现的位置(第一次出现)

vector<int> vet5{ 1,2,3,4 };
vector<int>::iterator ite=find(vet5.begin(), vet5.end(), 2);//前两个参数是查找的范围,第三个参数是要找的元素
//判断是否找到了
if (ite != vet5.end()) {cout << "找到了  " << *ite << endl;
}
else {//没找到 返回的最后一个有效元素的下一个cout << "没找到" << endl;
}

5.排序

::sort(vet6.begin(), vet6.end());//默认升序::sort(vet6.begin(), vet6.end(),greater<>());//指定降序,这里用了写好的降序会泽

6.获得相比大的容器,获得相比小的容器

vector<int> vet7{ 5,8,6};
vector<int> vet8{ 5,7,6,1,7,98,2,6,4,5 };vector<int> v7 = ::max(vet7, vet8);//按存入的顺序依次进行比较,判断完成后,返回容器(返回的是复制的容器)void fun3(pair<string, int> pr) {cout << pr.first << '-' << pr.second << "   ";
}
map<string, int> m1 = { {"21",5},{"30",7} };
map<string, int> m2 = { {"21",5},{"29",8} };map<string, int> mm1 = ::min(m1, m2);//把自动排序好的容器进行比较,先比较键值,再比较实值,判断完成后,返回容器(返回的是复制的容器)
::for_each(mm1.begin(), mm1.end(), &fun3); cout << endl;//进行遍历

二.迭代器

以链表的迭代器为例

正向迭代器遍历

list<int> lst{ 1,2,3,4 };
list<int>::iterator ite = lst.begin();	
while (ite != lst.end()) {cout << *ite << "  ";ite++;
}
cout << endl;

反向迭代器遍历

list<int>::reverse_iterator ite2= lst.rbegin();
while (ite2 != lst.rend()) {cout << *ite <<"  ";ite2++;
}
cout << endl;

反向迭代器传为正向迭代器

//这里我们结合删除来写一下代码
list<int>::reverse_iterator ite2= lst.rbegin();
while (ite2 != lst.rend()) {if (*ite2 == 2) {//删除为2的元素ite = ite2.base();//将反向迭代器,转为正向//这里注意将反向迭代器转为正向迭代器后,会整体向后移动一个元素ite = lst.erase(--ite);//这里向前移动一位break;}ite2++;
}	

三.容器适配器

1.容器适配器

1.容器适配器是一个封装了序列性容器的模板类,它在一般序列容器的基础上提供了一些不同的功能

2.容器适配器不支持迭代器,也不能使用算法函数

3.容器适配器默认都是用底层序列器实现的

4.容器适配器主要包括:stack栈适配器、queue队列适配器

2.栈(stack)

1.特点:

实现的是一个后入先出(Last-In-First-Out,LIFO)的压入栈。它默认是用deque

去实现的,但也可以用list vector等底层容器实现

2.使用的头文件为

#include <stack>
using namespace std;//需要打开std命名空间

3.关于栈的一些功能的使用

我们用模版T实例化为int类型的stack来进行功能的测试

1.添加,删除
stack<int> sta;
sta.push(1);//增加
sta.pop();//删除
2.获取栈中元素的个数
sta.size();
3.获取栈顶元素
 sta.top();
4.判断栈是否为空
sta.empty();//如果为空返回1,不为空返回0

3.队列(queue)

1.特点:

实现的是一个先入先出(First-In-First-Out,FIFO)的队列,它默认使用deque去实现的,但也可以用list等底层容器实现

2.使用的头文件为

#include <queue>
using namespace std;//需要打开std命名空间

3.关于队列的一些功能的使用

我们用模版T实例化为int类型的queue来进行功能的测试

1.添加,删除
queue<int> que;
que.push(1);;//增加
que.pop();//删除
2.获取队列中元素的个数
que.size();
3.获取队首元素
que.front()
4.判断队列是否为空
que.empty();//如果为空返回1,不为空返回0

四.仿函数

仿函数,本质上是一个类,通过重载operator()操作符实现了函数调用功能

看如下函数代码和仿函数代码,对仿函数进行理解

函数代码

int add(int a,int b){return a + b;
}int main(){cout<<add(10,20);//进行测试return 0;
}

仿函数代码

class ADD{int m_sum;//优点:有类的特征,如此代码,这里就可以对每次的加和进行一个存储int opreator()(int a,int b){m_sum + =a + b;return a + b;}
}int main(){ADD add;cout<<add(10,20);//进行测试return 0;
}

相关文章:

c++ STL--算法,迭代器,容器适配器,仿函数

c STL–算法&#xff0c;迭代器&#xff0c;容器适配器&#xff0c;仿函数 一.算法 1.使用的头文件为 #include<algorithm>//以这个头文件为主 #include<numeric>2.关于算法一些功能的使用 1.遍历 void fun1(int x) {cout << x << " "…...

springcloud3 bus+springconfig 实现配置文件的动态刷新(了解)

一 springcloud Bus的作用 1.1 springcloud的作用 spring cloud bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。 它整合了java的事件处理机制和消息中间件的功能。其中目前支持RabbitMQ和kafka 简介&#xff1a; bus实现多个服务的配置文件动态刷新。 1.2 …...

SpringMVC的架构有什么优势?——视图与模型(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

Vue中实现图片懒加载简单说明

1.安装 npm i vue-lazyload1.2.6 2.导入 import VueLazyload from "vue-lazyload"; 3.注册插件 说明&#xff1a;main.js文件 import imgs_src from "src" Vue.use(VueLazyload, {// 懒加载默认图片loading:"imgs_src" }); 4.前台 说明:vue文…...

zookeeper案例

目录 案例一&#xff1a;服务器动态上下线 服务端&#xff1a; &#xff08;1&#xff09;先获取zookeeper连接 &#xff08;2&#xff09;注册服务器到zookeeper集群&#xff1a; &#xff08;3&#xff09;业务逻辑&#xff08;睡眠&#xff09;&#xff1a; 服务端代码…...

项目中使用git vscode GitHubDesktopSetup-x64

一、使用git bash 1.使用git bash拉取gitee项目 1.在本地新建一个文件夹&#xff08;这个文件夹是用来存放从gitee上拉下来的项目的&#xff09; 2.在这个文件夹右键选择 git bash here 3.输入命令 git init (创建/初始化一个新的仓库) 4.输入命令 git remote add origin …...

【Linux操作系统】文件描述符fd

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux之路       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1…...

【RocketMQ入门-安装部署与Java API测试】

【RocketMQ入门-安装部署与Java API测试】 一、环境说明二、安装部署三、Java API 编写Producer和Consumer进行测试四、小结 一、环境说明 虚拟机VWMare&#xff1a;安装centos7.6操作系统源码包&#xff1a;rocketmq-all-5.1.3-source-release.zip单master部署&#xff0c;在…...

SystemVerilog之覆盖率详解

文章目录 1.0 覆盖率前言1.1 覆盖率类型1.2 覆盖策略及覆盖组1.3 覆盖率数据采样1.3.1 bin的创建与使用1.3.2 条件覆盖率1.3.3 翻转覆盖率1.3.4 wildcard覆盖率1.3.5 忽略bin与非法bin 1.4 交叉覆盖率1.4.1 排除部分cross bin1.4.2 精细化交叉覆盖率1.4.3 单个实例的覆盖率1.4.…...

Qt Designer设计的界面如何显示、即运行显示窗口界面

首先利用Qt Designer设计.ui文件&#xff0c;然后采用Tools->External Tools->PyUIC转换成.py文件。这个.py文件是.ui文件编译而来的&#xff0c;将这种文件由.ui文件编译而来的.py文件称之为界面文件。由于界面文件每次编译时候都会初始化&#xff0c;所以需要新建一个.…...

vue3的setup的使用和原理解析

setup是Vue 3中引入的一个新的组件选项。它是一个在组件实例创建之前被调用的函数&#xff0c;用于设置组件的初始状态、计算属性、方法等。setup函数是Vue 3中函数式组件的核心部分&#xff0c;它提供了一种新的方式来编写组件逻辑。 使用setup函数有以下几个步骤&#xff1a…...

Spring boot中的线程池-ThreadPoolTaskExecutor

一、jdk的阻塞队列&#xff1a; 二、Spring boot工程的有哪些阻塞队列呢&#xff1f; 1、默认注入的ThreadPoolTaskExecutor 视频解说&#xff1a; 线程池篇-springboot项目中的service层里简单注入ThreadPoolTaskExecutor并且使用_哔哩哔哩_bilibili 程序代码&#xff1a;…...

pgsql checkpoint机制(1)

检查点触发时机 检查点间隔时间由checkpoint_timeout设置pg_xlog中wall段文件总大小超过参数max_WAL_size的值postgresql服务器在smart或fast模式下关闭手动checkpoint 为什么需要检查点&#xff1f; 定期保持修改过的数据块作为实例恢复时起始位置&#xff08;问题&#xf…...

微信小程序 map地图(轨迹)

allMarkers效果图 废话少说直接上马&#xff08;最后是我遇到的问题&#xff09; cover-view是气泡弹窗&#xff0c;可以自定义弹窗&#xff0c;要配合js&#xff1a;customCallout&#xff0c;如果是非自定义的话&#xff1a;callout&#xff08;可以修改颜色、边框宽度、圆角…...

【钉钉接口】bpms_task_change、bpms_instance_change 的区别及举例

bpms_task_change&#xff1a;审批任务回调&#xff0c;是针对审批任务状态的推送。如审批人执行审批、审批人转交审批等针对具体某个审批节点的操作&#xff0c;属于 bpms_task_change 事件类型。bpms_instance_change&#xff1a;审批实例回调&#xff0c;是针对审批实例状态…...

vue左右div结构手动拉伸并且echarts图表根据拉伸宽高自适应

需求&#xff1a; 左右结构的div&#xff0c;可以根据数据抬起按下进行拉伸修改容器宽度的操作给左右结构某一图表设置拉伸自适应左右结构都设置个最小宽度&#xff0c;只能到一定区域内拉伸解决echarts的bug&#xff08;重复加载chart实例&#xff09;&#xff1a;[ECharts] …...

开发工具Eclipse的使用

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Eclipse是什么 二.使用Eclipse的…...

DrawerLayout布局使用教程Android侧边栏导航完全指南:创建简单实用的导航抽屉

导航抽屉&#xff08;侧边栏&#xff09;在现代移动应用中扮演着关键角色&#xff0c;提供了流畅的用户导航体验。本文将带您从头开始&#xff0c;逐步创建一个基本的 Android 侧边栏导航示例&#xff0c;为您的应用增添更多交互魅力。 1. 创建新的 Android 项目 首先&#x…...

Dynamics 365 实体快速创建功能启用

这里我会先用例子讲快速创建,包含了字段创建等内容。希望直接了解配置过程的,可以根据目目录跳转查看。 1 例子 我们这里创建了两个实体,学生和选择的科目。它们的关系是一个学生可以选择多个科目,即学生和科目选择是一对多关系。所以我们在选择的科目中创建了一个学生的…...

Mybatis三剑客(一)在springboot中自动生成Mybatis【generator】

1、pom.xml中新增plugin <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.7</version><configuration><overwrite>true</overwrite><…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...