当前位置: 首页 > 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><…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...