C++Prime Plus(6)

article/2025/9/14 4:08:53

目录

  • 92.STL(1)容器
  • 93.STL(2)迭代器
  • 94.STL(3)函数对象
  • 95.STL(4)算法

92.STL(1)容器

标准模板库 STL(Standard Template Library),是 C++ 标准库的一部分,不需要单独安装,只需要#include 头文件STL提供了容器,迭代器,函数对象等类模板和算法(函数模板)

容器:类似于数组,可以存放一组同类型的对象;

常用的容器为模板类vector(包含在头文件vector中),vector类似于数组,但具有更多功能:

  • 可以整体赋值
  • 不用操心空间问题
  • 可以通过下标访问
  • 可以用迭代器访问

vector示例:作为数组
fig1
vector示例:其他操作
fig2

93.STL(2)迭代器

STL的每个容器都有一个迭代器,被定义为容器的公有嵌套类,迭代器都分为两种迭代器:iteratorconst_iterator迭代器的功能类似指针,用于遍历容器中的元素


对于const_iterator,只能用于读取容器内的元素,不能改变其值


容器中一般提供了两个成员函数:begin和end,分别返回指向第一个节点和超尾节点的迭代器。(超尾节点是容器最后一个元素后面的节点,内容为NULL,即容器的超尾节点迭代器指向NULL)

vector中迭代器的使用
fig3
为什么使用迭代器

  • STL提供了众多容器,不同的容器的遍历存在差异,就比如对于数组和链表,遍历它们的具体实现是不同的,为了统一获得用for(iterator=begin(); iterator!=end(); iterator++)一样的遍历,STL在每个容器类中都写了iterator这样的嵌套类,为容器的访问和修改提供了便利。
  • 这可以类比python中的:for item in iterable

94.STL(3)函数对象

什么是函数对象
将一个函数作为另一个函数的参数

函数对象的应用举例
先设计一个在某容器中遍历的函数:
fig4
再设计一个在某容器中,将迭代器所指向的数据加1的函数
fig5
现在思考,能不能把这两个函数变得统一:回顾37.函数指针,将函数作为统一函数参数

我们先将需要的操作设计为函数output和add,此时的设计只需要考虑容器内的单个元素,所以实现更简单:
fig6
我们再设计统一函数general:

void general (vector<int>::iterator begin, vector<int>::iterator end, 指向函数的指针)

但是对于指向函数的指针这个参数,在统一函数的声明中,我们需要为指向函数的指针声明返回类型,形式参数列表。换言之,我们要用指向函数的指针实现统一,我们至少要确保output和add的函数原型是一样的(除了函数名不同)。

那我们该怎么做

  • 解决方案:将函数原型直接作为统一函数的函数模板参数,将函数视为参数对象,注意这种形式:函数对象(参数),可以看作是函数对象在使用函数调用符(),所以:函数对象(参数) 等价于 函数对象()参数

fig7
STL中,为了便于对任意容器进行逐一处理(general只能对vector操作),已经实现了for_each函数作为统一函数(包含在库algorithm中),for_each函数对某个迭代器范围内的每个元素执行指定操作,for_each被声明为:

template<class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function f);

注意输入for_each的函数对象(Function f)应当每次用于容器的一个元素;

因此,上面过程可以用for_each实现为:
fig8
STL预定义函数对象:C++将许多常见操作定义为函数对象(函数符),方便作为for_each和general这样的统一函数的参数(使用预定义的函数符必须包含头文件functional),预定义函数对象本质上是类模板
fig9
示例
fig10

95.STL(4)算法

在STL中,算法是处理容器的非成员函数,比如:排序sort,拷贝copy,查找find;包含在头文件algorithm中,算法的参数通常包含一个迭代器范围。

示例:排序一个vector
fig11

示例:vector中的查找
fig12


http://chatgpt.dhexx.cn/article/PP6Dtc0U.shtml

相关文章

C++Prime Plus(5)

目录 85.异常(1)异常处理机制86.异常(2)exception类87.RTTI(1)88.RTTI(2)89.类型转换运算符90.string类91.智能指针 85.异常(1)异常处理机制 异常&#xff1a;运行错误&#xff08;比如无法打开文件&#xff0c;动态内存申请失败&#xff09;&#xff0c;导致程序无法继续正常…

SAP Fiori学习笔记

资料链接&#xff1a;有些是需要自带梯子的哦&#xff5e; Fiori Design Guidelines​experience.sap.com戴团长&#xff1a;SAP Fiori Design​zhuanlan.zhihu.com如何评价 SAP Fiori Design Guidelines&#xff1f;​www.zhihu.comhttps://mp.weixin.qq.com/s?__bizMzIyNjY…

C++Prime Plus(2)

目录 21.for循环(1)22.for循环(2)23.while循环24.do while循环25.二维数组与嵌套循环26.if语句27.逻辑表达式28.条件表达式29.switch语句30.文件概念31.文本文件的输入输出32.函数详解(1)回顾33.函数详解(2)参数传递34.函数详解(3)数组传递35.函数详解(4)C风格字符串36.递归概念…

C++Prime Plus(1)

目录 1.C简介2.程序生成&#xff08;创建源码&#xff0c;编译和链接&#xff09;3.进入C4.C语句5.函数入门6.整型7.char&#xff0c;bool&#xff08;小整数&#xff09;8.const与符号常量9.浮点数10.算术表达式11.数组12.C风格字符串13.C风格字符串14.结构15.指针16.动态内存…

C++Prime Plus(7)

目录 96.输入输出概述97.使用cout输出(1)ostream基本功能98.使用cout输出(2)格式化输出99.使用cin输入100.文件(1)简单的文件IO101.文件打开的进一步讨论102.二进制文件访问103.随机读写 96.输入输出概述 C的输入输出是由库iostream中提供的一组类实现的&#xff1b; 流 C把输…

E-Prime软件包及安装

E-Prime软件包及安装 1 版本问题2 安装过程3 注意事项4 唠唠叨叨 Hello&#xff0c; 这里是行上行下&#xff0c;我是喵君姐姐~ 众所周知&#xff0c;E-Prime是实验设计的执行者。 当我们提出一个想法&#xff0c;则需要一个具体的软件来实现它。 而E-Prime相对于Matlab和Py…

Prime Sample

又发现了个框架 但没有代码啊~~ 还是搬来了&#xff0c;重要样本关注机制&#xff0c;一种新颖的目标检测框架 上论文 论文地址&#xff1a; https://arxiv.org/pdf/1904.04821.pdf 在目标检测框架中&#xff0c;平等对待所有样本并以平均性能最大化目标是一种常见的范例。在…

Prime Factors

此题需要使用到质因子分解的算法&#xff0c;可以参考以下链接&#xff1a; https://blog.csdn.net/qq_42410605/article/details/100150140 题目描述&#xff1a; Given any positive integer N,you are supposed to find all of prime factors,and write them in the form…

SpringBoot实现分布式锁

SpringBoot实现分布式锁 先了解一下线程数&#xff1a; 线程锁 线程锁&#xff1a;主要用来给类&#xff0c;方法&#xff0c;代码加锁&#xff0c;当某个方法或者某块代码使用synchronize关键字来修饰&#xff0c;那么在同一时刻最多只能有一个线程执行该代码&#xff0c;如…

深入理解ConcurrentHashMap原理分析以及线程安全性问题

在之前的文章提到ConcurrentHashMap是一个线程安全的&#xff0c;那么我么看一下ConcurrentHashMap如何进行操作的。 ConcurrentHashMap与HashTable区别&#xff1f; HashTable put()源代码 我们来看一下put 操作&#xff1a; 方法体 被 同步锁标记&#xff0c;由于同步锁的…

Redis分布式锁到底安全吗?

若有收获,请记得分享和转发哦 这篇文章我想和你聊一聊&#xff0c;关于 Redis 分布式锁的「安全性」问题。 Redis 分布式锁的话题&#xff0c;很多文章已经写烂了&#xff0c;我为什么还要写这篇文章呢&#xff1f; 因为我发现网上 99% 的文章&#xff0c;并没有把这个问题真正…

Java线程安全

前段时间有测试一个后端对账单和话单采集服务,在测试过程中有涉及到数据库读写逻辑和并发的场景,所以结合经验针对系统技术架构设计了部分并发场景结合数据库读写时可能出现的一些问题的用例,也确实出现了一些测试环境容易忽视,线上环境确确实实可能出现的问题,当然最后还是得到…

线程安全之 - ThreadLocal

ThreadLocal的底层原理 ThreadLocal是Java中所提供的线程本地存储机制&#xff08;线程内共享&#xff09;&#xff0c;可以利⽤该机制将数据缓存在某个线程内部&#xff0c; 该线程可以在任意时刻、任意⽅法中获取缓存的数据&#xff1b;ThreadLocal底层是通过ThreadLocalMap…

线程锁(ReentrantLock、synchronized)为何不能用作分布式锁

为什么使用分布式锁 分布式锁实现目前有三种&#xff1a; 数据库乐观锁&#xff1b;ZooKeeper的分布式锁;Redis的分布式锁&#xff1b; 在以前单体架构Web应用场景下&#xff0c;我们可以使用ReentrantLock或synchronized进行上锁&#xff0c;保证资源安全&#xff0c;现如今大…

Redis分布式锁真的安全吗?

大家好&#xff0c;今天我们来聊一聊Redis分布式锁。 首先大家可以先思考一个简单的问题&#xff0c;为什么要使用分布式锁&#xff1f;普通的jvm锁为什么不可以&#xff1f; 这个时候&#xff0c;大家肯定会吧啦吧啦想到一堆&#xff0c;例如java应用属于进程级&#xff0c;…

ThreadLocal能解决线程安全问题?胡扯!本文教你正确的使用姿势【享学Java】

跟对领导很重要&#xff1a;愿意教你的&#xff0c;并且放手让你做的领导要珍惜。 目录 前言正文ThreadLocal是什么&#xff1f;ThreadLocal怎么用&#xff1f;局限性InheritableThreadLocal向子线程传递数据开源框架使用示例 ThreadLocal不能解决共享变量的线程安全问题Thread…

Java线程安全详细总结

以下是我的PPT文档&#xff0c;不知道怎么复制到博客&#xff0c;只能一个一个插入图片发上来了。感觉总结的不错&#xff0c;分享一下。 文档地址&#xff1a;http://download.csdn.net/detail/csujiangyu/9526641

分布式系统详解--基础知识(线程)

分布式系统详解--基础知识&#xff08;线程&#xff09; 一、导读 前面跟大家讲了一下 分布式系统详解--基础知识&#xff08;概论&#xff09; &#xff0c;可以稍微了解一下大体上分布式是怎么一回事了。这片篇文章主要是讲述一下线程的问题分别介绍一下&#xff0c;什么线…

分布式项目线程安全问题(电商扣减库存的安全问题1)

电商减库存存在的安全问题 Override public void deductStock(Map<Long, Integer> skuMap) {for (Map.Entry<Long, Integer> entry : skuMap.entrySet()) {Long skuId entry.getKey();Integer num entry.getValue();// 查询skuSku sku getById(skuId);// 判断…

分布式项目中 如何保证线程安全问题?-------ZooKeeper

前沿&#xff1a; 上篇文章我们聊到了在解决分布式项目中线程安全问题&#xff0c;提到解决方案还有其他的&#xff0c;那么在此提出 基于 zookeeper 解决分布式项目中的线程安全问题 也是目前市面上比较流行的。做为一个高级开发工程师也是必须要学习的。 ZooKeeper是什么东…