STL之迭代器基本概念 [转贴]

C++:什么是STL? 什么是STL?1. STL概论1.1. STL基本概念1.2. STL六大组件简介1.3. STL优点2. STL三大组件2.1. 容器2.2. 算法2.3. 迭代器2.3. 案例 1. STL概论   长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模 阅读详情

STL是C++中重要部分之一(面向对象、STL、模板等),其中三个基本的STL组件包括:
1. 迭代器。迭代器之于容器相当于指针之于数组,提供了访问容器对象的方法,事实上C++中的指针也是一种迭代器,但是要注意迭代器不仅仅是指针,不一定具有地址值。
2. 容器。容器是一种模板类,例如list、vector、deques等,一般由迭代器访问容器中的数据。
3. 算法。STL中数据结构和算法是分离的,各种函数在广义容器中(包括链表、数组、string对象、容器)完全通用。

1.头文件:
STL头文件一般不使用.h扩展,其中主要使用的头文件和对应容器类如下:
#include Container Class
<deque> deque
<list>  list
<map>  map, multimap
<queue> queue, priority_queue
<set>  set, multiset
<stack> stack
<vector> vector
<string>  string
<iterator> ***<***>::iterator
<algorithm> 各种算法函数
STL均使用标准命名空间using namespace std。

2.迭代器:
迭代器有五种类型,这五种类型是一种继承关系,具体如下:
Input iterators:提供对数据的只读访问,前向推进。输入迭代器可以使用==和!=来测试是否相等;使用*来访问数据;使用++操作符前向推进。例如find函数需要保证输入迭代器。
Output iterators:提供对数据的只写访问,前向推进。输出迭代器缺省只写,由于该迭代器无法读取对象,因此不会在任何搜索和其他算法中使用它。
Forward iterators:提供读写访问,前向推进。例如replace函数需要保证前向迭代器。
Bidirectional iterators:提供读写访问,前向或后向推进。例如reverse函数需要保证双向迭代器。
Random access iterators:提供读写访问,随机移动(非const的指针也是随机迭代器)。STL中的排序和搜索函数使用随机访问迭代器,随机访问迭代器可以使用关系操作符做比较。
除此之外,还包括一些特殊的迭代器:
指针迭代器:一个指针也是一种迭代器。
常量迭代器:对于只读变量,为了防止错误赋值,可以使用常量迭代器const_iterator,该迭代器指向的对象不允许改变。注意:const ***<***>::iterator的含义是该迭代器成为常量,不可指向其他数据,与常量迭代器的含义是不一样的。

3.流迭代器
将输入输出(例如标准输入输出流cin/cout或者文件流等)作为容器看待,因此接受迭代器参数的算法都可以和流一起工作。
STL定义模板类ostream_iterator作为输出流迭代器,其构造函数有两个参数,包括一个ostream对象和一个string值(作为间隔符),因此可以象下面一样创建一个迭代器:
ostream_iterator<int>(cout, “/t”)             //定义cout迭代器
ofstream out(“text.txt”);
ostream_iterator<string> obegin(out, “/n”);       //定义文件流输出迭代器
STL定义模板类istream_iterator作为输入流迭代器,可指定读取的来源,并应该和结束迭代器比较。具体如下:
istream_iterator<int> intreader(cin);       //定义cin流迭代器
isteam_iterator<int> eof;
copy(istream_iterator<string>(cin), istream_iterator<string>(), 输出迭代器);      //定义无变量名的cin流迭代器
ifstream in(“text.txt”);
istream_iterator<string> ibegin(in);
istream_iterator<string> iend;            //定义文件流输入迭代器
还有一些具体应用如下:

//利用流迭代器填充vector
{
    ifstream 
in("test.txt");
    istream_iterator
<string> ibegin(in);
    istream_iterator
<string> iend;
    vector
<string> vec(ibegin, iend);
    copy(vec.begin(), vec.end(), ostream_iterator
<string>(cout, "/n"));
}

//利用输入流填充vector
{
    vector
<string> vec;
    copy(istream_iterator
<string>(cin), istream_iterator<string>(), back_inserter(vec));
    sort(vec.begin(), vec.end());
    copy(vec.begin(), vec.end(), ostream_iterator
<string>(cout,"/n"));
}

//利用流迭代器保存vector内容到文件
{
    ifstream 
in("test.txt");
    istream_iterator
<string> ibegin(in);
    istream_iterator
<string> iend;
    vector
<string> vec(ibegin, iend);
    ofstream 
out("testcopy.txt");
    copy(vec.begin(), vec.end(), ostream_iterator
<string>(out, "/n"));    
}

注意:上面用输入流迭代器来初始化vector后,不可再用这个输入流迭代器,因为随着数据的读取,迭代器已经到达输入流或者文件流的末尾了。

4.插入迭代器:
int arr[] = {1, 2, 3, 4, 5};
vector<int> vi;
copy(arr, arr + 5; vi.begin());
该语句不会执行,因为没有为vi分配存储空间。此时使用插入迭代器可以将值插入到容器中,自动为vi扩展存储空间,主要包括三种插入迭代器。
普通插入器:将对象插入到容器任何对象的前面。该迭代器使用容器的insert操作符替代赋值运算符,第一个参数是容器本身,第二个参数是容器迭代器指定插入位置。
Front inserters:将对象插入到数据集的前面,例如链表表头。该迭代器使用push_front操作替代赋值运算符,参数是容器本身。
Back inserters:将对象插入到数据集的尾部,例如vector的尾部,导致vector容器扩展。该迭代器调用容器的push_back操作替代赋值运算符,参数是容器本身。
注意:使用插入迭代器可能导致容器中的其他对象移动位置,因此现有的迭代器变成非法,需要重新赋值(list除外,不受影响)。

int arr[] = {1, 2, 3, 4, 5};
vector
<int> vi;
copy(arr, arr 
+ 5; front_iterator(vi));
//最终结果按序是5 4 3 2 1,因为每次调用push_front将一个数据插入到vi的前面。
Vector<int>::iterator p = find(vi.begin(), vi.end(), 2);
copy(arr, arr 
+ 2, inserter(vi, p));
//最终结果是5 4 3 1 2 2 1,因为调用insert一次性将所有数据插入到p前。


5.混合迭代器函数:
下面两个迭代器函数非常有用:
advance(iterator, int):按照指定的数目增减迭代器。第一个参数是迭代器,第二个参数是增减的数目(前向迭代器该数必须为正,双向或者随机迭代器该数可以为负)。
distance(iterator, iterator, int&):返回到达一个迭代器所需递增操作的数目。该函数是递归的,每次递归第三个参数,因此必须初始化该参数为0然后使用该函数。

30分钟学习STL STL概述 STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。 要点 STL算法作为模板函数提供。为了和其他组件相区别,在本书中STL算法以后接一对圆括弧的方式表示,例如sort()。 STL另一个重要特性是它不是面向 阅读详情

相关推荐

C++ STL笔记一:初识STL;容器;算法;迭代器;容器装数据

一:由来: 长久以来,软件界一直希望建立一种可重复利用的东西。 C++的面向对象和泛型编程思想,目的就是复用性的提升。 面向对象:三大特点: 封装:将事物共有的特性(共性)抽离出来,封装为一个类,基于类具体化实例。从而提高复用性。物以类聚。 继承:子类继承父类。把父类的东西(属性、行为)都拿过来,子类不用再次重新声明一遍。也提高了代码的复用性。 多态:一个函数名称,有多个实现方式。根据调用的对象不同,产生不同的结果。不同的子类实例赋值给父类变量,来实现多态。也提高了代码复用性。

xiaoyaolangwj的博客 1589

STL_迭代器

对容器进行遍历读取数据,将容器和算法进行分离。 1 迭代器种类 表2 迭代器种类 种类 支持功能 关联的容器 输入迭代器 输出迭代器 正向迭代器 ++p, p++, *P forward_list、unordered_map/unordered_map、unordered_set/unordered_multiset 双向迭代器 具有正向迭代器的所有功能,支持--p, p-...

weixin_42542290的博客 246

迭代器和反向迭代器,常量迭代器和非常量迭代器

迭代器的类型共有4种:<T>::Iiterator,<T>::const_iterator,<T>::reverse_iterator,<T>::const_reverse_iterator #include <iostream> #include <string> #include <algorithm> #include <iterator> using namespace std; int main(.

digitalkee的博客 1626

STL迭代器详解

文章目录1. 迭代器(iterator)是一种智能指针(smart pointer)2. 迭代器相应类型(associate types) 不同于OOP(Object Oriented Programming)将数据(datas)和行为(methods)组织在一起的思想,STL的中心思想GP(Generic Programming)在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以胶着剂将它们撮合在一起。那么之间的胶着剂就是迭代器(iterator)。

To the beyond and infinity! 2779

Mid-360激光雷达与Fast-LIO2实战:从环境搭建到实时点云建图

本文提供Livox Mid-360激光雷达与Fast-LIO2算法从零开始的实战教程。详细介绍了在Ubuntu和ROS环境下进行系统配置、依赖安装、硬件连接与网络设置的完整流程,并指导如何运行算法实现实时点云建图与可视化,最后总结了关键参数调优与常见问题排查方法。

weixin_29300241的博客 152

还在用iReport 5.6.0?手把手教你用JasperSoft Studio 6.8.0设计报表(附JDK 11+兼容方案)

本文详细介绍了从iReport 5.6.0迁移到JasperSoft Studio 6.8.0的全过程,包括JDK 11+环境配置、项目迁移实战、高级特性应用及常见问题解决方案。帮助开发者高效完成报表生成工具的升级,提升开发体验和报表性能。

weixin_30687051的博客 407

跟我学C++中级篇——STL的迭代器

一、迭代器介绍 迭代器(Iterator),是一种抽象的概念,在设计模式中也有这种设计模式,它提供了一种方式,能够依次访问容器的相关元素,并且不需要暴露容器内部的相关细节。说得直白一些,就是提供了一套访问所有容器的相关的抽象。它提供了访问这些容器的最小的公共接口,将算法和容器进行了解耦,并利用迭代器将其二者再进行合理的粘合。 迭代器的比较粗浅的理解方式是把它当作一个普通的指针,而指针一般可以进行++和–操作。从而达到对容器内部元素的逐一访问。但实际上,迭代器比之要复杂许多,因为它是抽象出来,普适几乎所有的容

fpcc的专栏 444

昇腾310B实战:FFmpeg硬件加速全流程解析与性能优化

本文详细解析了昇腾310B与FFmpeg硬件加速的全流程,包括环境配置、性能优化及常见问题排查。通过实战案例展示,昇腾310B在视频转码中性能提升可达6倍,同时降低功耗,特别适合多媒体处理和高性能计算场景。

m3n5b7v8c9x的博客 732

常量迭代器 const_iterator

using std::vector::const_iterator; const_iterator p = container.begin(); *p = 'Z';会报错

chenminghe271的专栏 812

【专业书1】量化交易——从入门到精通

股票季节性策略几乎失效了,但商品期货的仍有效,因为其季节性需求源于真实的经济需求而非投机。交易策略获利的前提:交易价格处于均值回归(低价时买入)或动量状态(降价时先做空后以更低价买入),否则在随机游走状态下是无法有效交易的。构建交易策略实际上是在决定:在特殊条件、特定时间尺度下价格趋势的呈现(均值回归/趋势走势),以及用什么价格作为初始判断的参考价格。如果以高夏普比率为目标,需要更高的交易频率:基于大数定律,押注越多,偏离均值收益的偏差就越小。买同比最好的股票,卖同比最差的股票。但在不同的时间尺度下可以。

weixin_44589682的博客 1545

腾讯大佬总结的170道 python面试题

简述基于 TCP 协议的套接字通信流程。19.面向对象中`__new__` 和 `__init__` 区别。86. 解释 Python 中的`//`,`%`和`**`运算符。45.isinstance 的作用以及与 type()的区别。3. 简述下 Python 中的字符串、列表、元组和字典。143. 如何高效的找到 redis 中的某个 KEY。140. 如何保证 redis 中的数据都是热点数据。147. redis 中的 watch 的命令的作用。108. 简述 进程、线程、协程的区别以及应用场景。

AudiA6LV6的博客 486

【C++ 十】STL基本概念、STL六大组件、STL容器、STL算法、STL迭代器

本文包含 STL 的诞生、STL 基本概念、STL 六大组件、STL 容器、STL 算法、STL 迭代器、vector 存放内置数据类型、vector 存放自定义数据类型、vector 容器嵌套容器。

qq_45138120的博客 1085

使用MATLAB/Simulink对一个简单的智能家居温湿度监测与控制系统进行建模和仿真

目录手把手教你学Simulink——基于Simulink的智能家居温湿度监测与控制仿真建模示例一、背景介绍二、所需工具和环境三、步骤详解步骤1:创建Simulink模型步骤2:构建传感器模块步骤3:添加控制器步骤4:构建执行器模块步骤5:连接各部分步骤6:设置仿真参数步骤7:添加观测器步骤8:运行仿真并分析结果四、总结 智能家居系统中的温湿度监测与控制系统是一个典型的物联网(IoT)应用场景,它通过传感器收集环境数据,并根据预设条件自动调节室内温度和湿度以提高居住舒适度。本指南将介绍如何使用MATLAB/S

xiaoheshang_123的博客 291

【C++编程语言】之 STL初始 基本概念 六大组件 容器 算法 迭代器

​ 如何在vector中存放自定义数据类型,并打印输出# include # include //vector 容器存放自定义数据类型 class Person {public :} };//vector 容器存放自定义数据类型 void test01() {//创建了一个vector容器,用于存放Person vector < Person > v;"张三" , 10 };"王超" , 20 };"满焊" , 50 };

kaszxc的博客 279

基于STM32、HAL库、I2C接口的姿态传感器/陀螺仪之ICM-42670-P驱动 C语言程序设计

/ 设置加速度计和陀螺仪的工作模式。// 读取加速度计和陀螺仪数据。

corlin6688的博客 1179

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ STL STL的意义、基本概念、六大组件,STL中容器、算法、迭代器

C++ STL STL的意义、基本概念、六大组件,STL中容器、算法、迭代器

UUUUU22的博客 611

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STL诞生,STL基本概念,STL六大组件,STL容器、算法、迭代器

STL诞生 长久以来,软件界希望建立一种可重复利用的东西 C++的面向对象和泛型编程思想就是为了提升复用性 为了建立数据结构和算法的标准,诞生了STL STL基本概念 STL(Standard Template Library)标准模板库 从广义上分为容器(container),算法(algorithm),迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接 STL几乎所有代码都采用了模板类或模板函数 STL六大组件 六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空

shy的博客 624

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

7.23C++:泛型程序设计基本概念:概念&模型、STL基本组件:容器&迭代器&函数对象&算法、STL程序实例:transform算法

术语:概念  用来界定具备一定功能的数据类型。例如:  将“可以比大小的所有数据类型(有比较运算符)”这一概念记为 Comparable  将“具有公有的复制构造函数并可以用‘=’赋值的数据类型”这一概念记 为Assignable  将“可以比大小、具有公有的复制构造函数并可以用‘=’赋值的所有数据 类型”这个概念记作Sortable。  对于两个不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能, 那么就说概念B是概念A的子概念。例如:  Sortable既是Comparabl

weixin_44478659的博客 228

地平线征程系列量产突破1500万颗:从芯片到工具链的智驾跃迁

智能驾驶芯片的量产能力,是衡量一家企业真正技术落地实力的核心标尺。在智驾产业中,算力参数固然吸引眼球,但决定芯片能否大规模上车的关键,往往在于工具链的成熟度、功能安全认证的完备性以及覆盖不同价位车型的产品矩阵。从L2级ADAS到高阶城市NOA,智驾功能的普及正推动芯片方案从单一旗舰走向平台化布局。地平线征程6家族通过BPU架构迭代,实现了从入门级到560 TOPS旗舰算力的全价位覆盖,其量产突破1500万颗的背后,正是工具链、功能安全与产品化三重工程能力的综合体现。随着智驾平权趋势加速,10-20万元车型成

weixin_34194087的博客 312

C++_STL_01_STL概论(基本概念;六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器;优点)

所有的STL主要都是采用模板的技术写的,学习模板不是为了自己写模板,而是怎么使用模板容器、算法、迭代器、仿函数(重载了小括号)、适配器(配接器)、空间配置器。各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。-类模板各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.-函数模板。

分享学习成长历程,Winter is coming! 1008

STL学习(1)

容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)算法:各种常用的算法,如sort、find、copy、for_each等。:强调值的排序,序列式容器中的每个元素均有固定的位置。空间配置器:负责空间的配置与管理。

qq_64683775的博客 84

STL迭代器模版详解

1.STL iterator迭代器 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。 STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的

nihao_2014的博客 512

STL_迭代器iterator

迭代器Iterator

qq_42766309的博客 639

迭代器之入门介绍(下)

迭代器之入门介绍(下)我们又见面了~~或许之前的内容你觉得都比较简单,那么这次得有点心理准备,我打算讲稍微深入一些的东西。而且可能也不会讲那么详细,或者说废话那么多了,点到为止,剩下的,你最好还是自己去查一查。哎呀,没心理准备?那就在此之前先聊个最简单的小玩意吧。最简单的迭代器:指针呵呵,是的没错,最简单的迭代器就是我们早已打交道n久老伙计——指针。语言的原生(native)指针。不信?想想指针可

sandy_zc_1的专栏 2684

C++STL(九):迭代器

/ 简单的整数范围迭代器private:int value;public:// 迭代器特性定义// 解引用操作// 前缀递增++value;// 后缀递增++(*this);// 相等比较// 不等比较return!// 整数范围容器private:public:// 输出:1 2 3 4 5return 0;

2301_81171484的博客 736
上一篇: C++ STL基本容器string,vector,list,deque,map..[转]
下一篇: 对包含Struct的Vector就其中的一种属性排序 [转贴]
发现心流
博客等级 码龄20年 52粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值