C++ STL中迭代器介绍

C++ 迭代器iterator和指针 相似之处 1.指针和iterator都支持与整数进行+,-运算,而且其含义都是从当前位置向前或者向后移动n个位置 2.指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离 3.通过指针或者iterator都能够修改其指向的元素 不同之处 指针是C语言里面就有的东西,而迭代器是C++里面才有的。 以下转自:https://blog.c... 阅读详情
迭代器

本文是转载,出处不明0.0

迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组索引,也可以认为是一种迭代器。

迭代器有各种不同的创建方法。程序可能把迭代器作为一个变量创建。一个STL容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取数据。你还可以使用其他数学操作符如++。典型的,++操作符用来递增迭代器,以访问容器中的下一个对象。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。使用一个past-the-end值得指针来访问对象是非法的,就好像使用NULL或为初始化的指针一样。

提示

STL不保证可以从另一个迭代器来抵达一个迭代器。例如,当对一个集合中的对象排序时,如果你在不同的结构中指定了两个迭代器,第二个迭代器无法从第一个迭代器抵达,此时程序注定要失败。这是STL灵活性的一个代价。STL不保证检测毫无道理的错误。

迭代器的类型

对于STL数据结构和算法,你可以使用五种迭代器。下面简要说明了这五种类型:

·       Input iterators 提供对数据的只读访问。

·       Output iterators 提供对数据的只写访问

·       Forward iterators 提供读写操作,并能向前推进迭代器。

·       Bidirectional iterators提供读写操作,并能向前和向后操作。

·       Random access iterators提供读写操作,并能在数据中随机移动。

尽管各种不同的STL实现细节方面有所不同,还是可以将上面的迭代器想象为一种类继承关系。从这个意义上说,下面的迭代器继承自上面的迭代器。由于这种继承关系,你可以将一个Forward迭代器作为一个output或input迭代器使用。同样,如果一个算法要求是一个bidirectional迭代器,那么只能使用该种类型和随机访问迭代器。

指针迭代器

正如下面的小程序显示的,一个指针也是一种迭代器。该程序同样显示了STL的一个主要特性——它不只是能够用于它自己的类类型,而且也能用于任何C或C++类型。Listing1, iterdemo.cpp, 显示了如何把指针作为迭代器用于STL的find()算法来搜索普通的数组。

表 1. iterdemo.cpp

#include <iostream.h>
#include <algorithm>
using namespace std;
#define SIZE 100
int iarray[SIZE];
int main()
{
      iarray[20] =50;
      int* ip =find(iarray, iarray + SIZE, 50);
      if (ip ==iarray + SIZE)
          cout<< "50 not found in array"<< endl;
    else
          cout<< *ip<< " found in array"<< endl;
    return 0;
}

在引用了I/O流库和STL算法头文件(注意没有.h后缀),该程序告诉编译器使用std名字空间。使用std名字空间的这行是可选的,因为可以删除该行对于这么一个小程序来说不会导致名字冲突。

程序中定义了尺寸为SIZE的全局数组。由于是全局变量,所以运行时数组自动初始化为零。下面的语句将在索引20位置处地元素设置为50,并使用find()算法来搜索值50:

iarray[20] = 50;int* ip = find(iarray, iarray + SIZE, 50);

find()函数接受三个参数。头两个定义了搜索的范围。由于C和C++数组等同于指针,表达式iarray指向数组的第一个元素。而第二个参数iarray+ SIZE等同于past-the-end值,也就是数组中最后一个元素的后面位置。第三个参数是待定位的值,也就是50。find()函数返回和前两个参数相同类型的迭代器,这儿是一个指向整数的指针ip。

提示

必须记住STL使用模板。因此,STL函数自动根据它们使用的数据类型来构造。

为了判断find()是否成功,例子中测试ip和 past-the-end值是否相等:

if (ip == iarray + SIZE) ...

如果表达式为真,则表示在搜索的范围内没有指定的值。否则就是指向一个合法对象的指针,这时可以用下面的语句显示::

cout << *ip<< " found in array"<< endl;

测试函数返回值和NULL是否相等是不正确的。不要象下面这样使用:

int* ip = find(iarray, iarray + SIZE, 50);if (ip != NULL) ... //??? incorrect

当使用STL函数时,只能测试ip是否和past-the-end值是否相等。尽管在本例中ip是一个C++指针,其用法也必须符合STL迭代器的规则。

容器迭代器

尽管C++指针也是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象。两个典型的容器类方法是begin()和end()。它们在大多数容器中表示整个容器范围。其他一些容器还使用rbegin()和rend()方法提供反向迭代器,以按反向顺序指定对象范围。

下面的程序创建了一个矢量容器(STL的和数组等价的对象),并使用迭代器在其中搜索。该程序和前一章中的程序相同。

Listing 2. vectdemo.cpp

#include <iostream.h>
#include <algorithm>
#include <vector>
using namespace std;

vector<int>intVector[100];

void main()
{
      intVector[20] = 50;
    vector<int>::iterator intIter=      find(intVector.begin(), intVector.end(), 50);
    if (intIter !=intVector.end())     
              cout << "Vector contains value "<< *intIter<< endl;
      else
          cout<< "Vector does not contain 50"<< endl;
}

注意用下面的方法显示搜索到的数据:

cout << "Vector contains value "<< *intIter<< endl;常量迭代器

和指针一样,你可以给一个迭代器赋值。例如,首先申明一个迭代器:

vector<int>::iterator first;

该语句创建了一个vector<int>类的迭代器。下面的语句将该迭代器设置到intVector的第一个对象,并将它指向的对象值设置为123::

first = intVector.begin();*first = 123;

这种赋值对于大多数容器类都是允许的,除了只读变量。为了防止错误赋值,可以申明迭代器为:

const vector<int>::iteratorresult;
result = find(intVector.begin(), intVector.end(), value);
if (result != intVector.end())
          *result = 123; // ???

警告

另一种防止数据被改变得方法是将容器申明为const类型。

『呀!在VC中测试出错,正确的含义是result成为常量而不是它指向的对象不允许改变,如同int *constp;看来这作者自己也不懂』


JAVA:Spring Boot 集成 Forest 优雅的 HTTP 客户端 Forest是一个优雅的Java HTTP客户端框架,通过注解式声明简化HTTP接口调用。它支持多HTTP客户端、自动参数绑定、序列化、重试机制和拦截器等功能。本文演示了如何在Spring Boot中集成Forest,包括配置、接口定义和调用示例,还展示了POST请求、文件上传等常见场景。相比传统HTTP客户端,Forest具有声明简洁、功能完善的特点,特别适合微服务调用和第三方API对接,能显著提升开发效率和代码可维护性。 阅读详情

相关推荐

Zynq 【SDK裸机开发之PS】——DDR的内存分配使用详解

Zynq如果跑操作系统的话,内存管理的工作都会交给系统来操作,但是如果是裸机的话,则需要自己对DDR3的内存进行管理。

shizhibuyi1234的博客 7377

C++:vector、iterator

一、vector 向量 1、vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型。因此,vector 和 vector 都是数据类型。使用 vector 之前,必须包含相应的头文件 #include using std::vector; 2、初始化 vector v1; vector保存类型为

未名湖畔的落叶 966

Pytorch的一小步,昇腾芯片的一大步

相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片!

机器学习-深度学习-图像处理-opencv-段子 5240

C++容器vector和迭代器iterator

vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件#include&lt;vector&gt;1.vector对象的定义和初始化[cpp] view plain copyvector&lt;T&gt; v1             vector保存类型为T的对象。默认构造函数,v1为空  vector&lt;T...

Hello_GY 的博客 5522

DDR4 IP的用户接口

DDR4 IP核用户接口

bowen_wener的博客 1925

R语言计算植物群落重要值:从基础概念到优势种判定

在植被生态学研究中,重要值是衡量物种在群落中地位的核心指标,它综合了相对多度、相对频度与相对显著度三个维度,能够客观反映物种的数量优势、分布广度与空间占据能力。理解重要值的生态学逻辑,是开展群落分类、优势种判定及多样性分析的基础。而R语言凭借其批量处理、可复现和与后续多元统计无缝衔接的优势,成为生态学研究者处理样方数据的高效工具。从野外记录的宽表到标准化长表,再到分组汇总计算相对指标,R语言能够显著提升数据处理效率与准确性。本文以实测群落数据为例,系统梳理重要值的两种算法口径、基于dplyr和tidyr的完

weixin_42634811的博客 265

【C++】 vector和迭代器

迭代器(iterator)是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。类似于指针类型,迭代器也提供了对对象的间接访问。C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector、string)支持数组下标操作访问容器元素。b表示v的第一个元素,e表示v尾元素的下一个位置。

wei_y0117的博客 3181

小程序强制更新避坑指南:手把手教你实现无缝升级

本文详细解析小程序强制更新的实现方法,重点介绍wx.getUpdateManager API的使用技巧,帮助开发者规避冷热启动机制下的版本管理陷阱。通过实战案例展示如何设计多级更新提示策略,确保用户无缝升级,提升小程序版本更新率。

star的博客 280

【C++ STL迭代器】详细介绍

C++ 允许用户定义自己的迭代器,通过实现迭代器接口的相关函数,可以将自定义数据结构与 STL 算法结合使用。

YRB0127的博客 2794

ChatGPT Web转API工具:原理、部署与集成实战

在AI应用开发中,API(应用程序编程接口)是实现系统间通信和数据交换的核心技术,它通过标准化的请求响应机制,将复杂功能封装为可编程的服务。其工作原理基于HTTP协议,通过定义清晰的端点、方法和数据格式,使不同平台的应用能够高效集成AI能力。这一技术价值在于极大降低了开发门槛,促进了自动化流程和智能功能的快速落地,广泛应用于智能客服、内容生成和创意辅助等场景。本文聚焦于如何通过浏览器自动化技术,将ChatGPT的Web界面能力转化为标准API服务,其中涉及Playwright无头浏览器操作和会话Cookie

weixin_42533910的博客 1761

一篇文章带你搞定数学建模中的线性回归模型(05年长江水质问题示例讲解含代码)

文章目录一、问题分析二、原理讲解三、MATLAB 实现线性回归模型 一、问题分析 根据你的预测分析,如果未来10年内每年都要求长江干流的Ⅳ类和Ⅴ类水的比例控制在20%以内,且没有劣Ⅴ类水,那么每年需要处理多少污水 为了达到题目中所要求的水质,可建立废水排放量与各类水百分比之间的二元线性回归模型,对未来十年的废水排放量进行预测,并确定其与各类水所占百分比之间的函数关系式。通过此关系式,可以计算在这种情况下长江所能承受的最大污水排放量,将这个排放量与预测的排放量进行比较,多出来的部分就是需要每年处理掉的。 二、

南淮北安的博客 2165

C++学习篇——C++ STL中迭代器介绍

迭代器(iterator)是连接容器和算法的纽带,为数据提供了抽象,使写算法的人不必关心各种数据结构的细节。迭代器提供了数据访问的标准模型——对象序列,使对容器更广泛的访问操作成为可能。 泛型编程的关键所在,就是如何找到一种通用的方法,来访问具有不同结构的各种容器中的每个元素,而这正是迭代器的功能。 迭代器是一种广义的指针,是指向序列元素指针概念的一种抽象。迭代器可以指向容器中的任意元素,还能

陈嘉怡的专栏 1164

Spring AI 实战:第七章、Spring AI Advisor机制之记忆大师

从金鱼到最强大脑通过 Spring AI 的记忆功能,我们成功让 AI:记住了用户身份实现了多用户隔离做到了持久化存储最终效果用户:“和上次一样” → AI 秒懂用户:“你知道我的名字吗?” → AI:“当然,张三!AI的进化路线🐟金鱼脑 →🧠最强大脑 →🏛️记忆宫殿管理员。

liaokailin的专栏 1516

【C++】STL之迭代器介绍、原理、失效

今天抽空来看看C++标准库中迭代器的相关知识。 一、迭代器有什么用? 我们知道,STL标准库一共有六大部件:分配器、容器、迭代器、算法、仿函数、适配器。其中,迭代器就是用来“联结”算法、仿函数与容器的纽带。 除此之外,在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行.

青玉白露的博客 977

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++_STL和数据结构《1》_STL介绍、STL的迭代器、c++中的模版、STL容器中的vector、列表初始化、三个算法、链表、STL中容器总结

对于c++的学习,基础阶段已经过去了,打开c++灵活运用大门的钥匙就是c++中的STL和数据结构的知识,学习这部分知识,首先要对c++中的一些库有一定的认知,知道如何用类实现;要达到这个水平,写c++的类就是基本要求了,所以在这部分学习阶段,如果遇到前面遗漏的知识,我会继续补充在“C++查缺补漏”的相关文章。通过对STL库学习,要掌握其中的一些重要函数(会用、明理、能修改)。数据结构的学习会穿插学习算法,因为数据结构和算法本来就不分家,因此学习记录一些算法就至关重要了,同时刷题也就必不可少了。

sz1125218970的博客 1203

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

vector的文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。

RO-BERRY 1738

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

46 C++基础-STL迭代器和算法介绍

1.迭代器 迭代器提供对一个容器的对象的访问方法。迭代器就如同一个指针。事实上,c++的指针也是一种迭代器,但是迭代器不仅仅是指针 除了使用下标来访问 vector 对象外,标准库还提供了另一种访问元素的方法:使用迭代器。迭代器是一种检查容器内元素并遍历元素的数据类型 标准库为每一种标准容器定义了一种迭代器类。迭代器类型提供了比下标操作更加通用化的方法。所有的标准库容器都定义了相应的迭代器类...

苏法迪的专栏 218

迭代器--针对于c++的STL介绍

文章目录迭代器基本原理一、种类1、输入迭代器2、输出迭代器3、正向遍历4、双向迭代器5、随机迭代器双向迭代器的支持随机迭代器支持正向遍历反向遍历 迭代器基本原理 迭代器是一个“可遍历STL容器内全部或部分元素”的对象 迭代器指出容器中的一个特定位置 迭代器就如同一个指针 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中的对象的范围 一、种类 1、输入迭代器 输入迭代器:又叫“只读迭代器”,他从容器中读取元素 只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序

Xiao_qsn的博客 235

【C++】STL反向迭代器模拟实现,迭代器适配器,迭代器类型简单介绍

主要讲解了反向迭代器以及模拟实现,利用vector和list进行了验证,最后补充了迭代器的类型,为今后进一步学习C++打下了坚实的基础

FLASH的博客 1046

容器删除元素后迭代器失效_[C++ STL] 各容器简单介绍

一、什么是STL?1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库,包含了诸多常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。2、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)。在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数...

weixin_33879932的博客 190

C++ 有关于STL中 迭代器的基本介绍 20180321day11

/*迭代器的总结*/1 iterator====&gt;正向迭代器 正向遍历中 begin() 指向容器的首个元素end() 指向容器最后一个元素的后面一个内存  当  it = a.end() 的时候就已经代表遍历完毕2 reverse_iterator====&gt; 逆向迭代器 逆向遍历中 rbegin() 指向容器的最后一个元素 rend() 指向容器第一个元素的前面一个内存  当  it...

m0_37335203的博客 168
上一篇: c++map的用法
下一篇: STL中map用法详解
Magic_____
博客等级 码龄14年 11粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值