C++ Iterator 迭代器 介绍
c++中iterator用法

c++中iterator用法详解在C++中,迭代器(Iterator)是一种用于遍历容器中元素的抽象概念。
迭代器提供了一种统一的方式来访问容器中的元素,而不需要暴露容器的内部实现细节。
不同类型的容器(如数组、链表、向量、映射等)都支持迭代器,因此你可以使用相同的代码来遍历它们。
以下是一些常见的迭代器用法详解:1. 迭代器的基本使用:```cpp#include <iostream>#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用迭代器遍历vectorfor (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {std::cout << *it << " ";}return 0;}```在上面的例子中,`numbers.begin()`返回指向容器起始位置的迭代器,而`numbers.end()`返回指向容器末尾的下一个位置的迭代器。
使用迭代器进行循环遍历容器。
2. auto关键字简化迭代器类型:```cpp#include <iostream>#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用auto关键字简化迭代器类型for (auto it = numbers.begin(); it != numbers.end(); ++it) {std::cout << *it << " ";}return 0;}```使用`auto`关键字可以简化迭代器类型的声明,使代码更为简洁。
C++迭代器(STL迭代器)iterator详解

C++迭代器(STL迭代器)iterator详解C++迭代器(STL迭代器)iterator详解要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进⾏。
迭代器是⼀个变量,相当于容器和操纵容器的算法之间的中介。
迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。
从这⼀点上看,迭代器和指针类似。
迭代器按照定义⽅式分成以下四种。
1) 正向迭代器,定义⽅法如下:容器类名::iterator 迭代器名;2) 常量正向迭代器,定义⽅法如下:容器类名::const_iterator 迭代器名;3) 反向迭代器,定义⽅法如下:容器类名::reverse_iterator 迭代器名;4) 常量反向迭代器,定义⽅法如下:容器类名::const_reverse_iterator 迭代器名;迭代器⽤法⽰例通过迭代器可以读取它指向的元素,*迭代器名就表⽰迭代器指向的元素。
通过⾮常量迭代器还能修改其指向的元素。
迭代器都可以进⾏++操作。
反向迭代器和正向迭代器的区别在于:对正向迭代器进⾏++操作时,迭代器会指向容器中的后⼀个元素;⽽对反向迭代器进⾏++操作时,迭代器会指向容器中的前⼀个元素。
迭代器的功能分类不同容器的迭代器,其功能强弱有所不同。
容器的迭代器的功能强弱,决定了该容器是否⽀持 STL 中的某种算法。
例如,排序算法需要通过随机访问迭代器来访问容器中的元素,因此有的容器就不⽀持排序算法。
常⽤的迭代器按功能强弱分为输⼊、输出、正向、双向、随机访问五种,这⾥只介绍常⽤的三种。
1) 正向迭代器。
假设 p 是⼀个正向迭代器,则 p ⽀持以下操作:++p,p++,*p。
此外,两个正向迭代器可以互相赋值,还可以⽤==和!=运算符进⾏⽐较。
2) 双向迭代器。
双向迭代器具有正向迭代器的全部功能。
除此之外,若 p 是⼀个双向迭代器,则--p和p--都是有定义的。
--p使得 p 朝和++p 相反的⽅向移动。
iterator的hasnext方法

iterator的hasnext方法摘要:1.迭代器简介2.hasNext方法的作用3.实现原理4.应用场景5.示例代码正文:迭代器(Iterator)是Java集合框架中的一种重要组件,它用于遍历集合元素。
在迭代器中,有一个常用的方法——hasNext,该方法用于判断迭代器中是否还有下一个元素。
本文将详细介绍迭代器的hasNext方法,包括其实现原理和应用场景。
1.迭代器简介迭代器是一个实现了Iterator接口的类,它提供了一种安全且高效的方式來遍历集合。
迭代器内部维护了一个计数器,用于记录当前遍历到的元素位置。
在遍历过程中,可以通过调用迭代器的方法来获取下一个元素、判断是否还有下一个元素以及跳过某个元素等。
2.hasNext方法的作用hasNext方法用于判断迭代器中是否还有下一个元素。
如果迭代器中仍有元素,则返回true,否则返回false。
在实际应用中,可以使用hasNext方法来确保遍历过程的安全性,避免在遍历过程中意外地删除集合中的元素。
3.实现原理迭代器的实现原理主要包括以下几点:(1)内部维护一个计数器,记录当前遍历到的元素位置。
(2)当调用next方法获取下一个元素时,如果计数器为0,则表示已经遍历完所有元素,抛出NoSuchElementException异常。
(3)当调用hasNext方法判断是否有下一个元素时,如果计数器大于0,则返回true,否则返回false。
4.应用场景迭代器的hasNext方法在以下场景中具有重要应用:(1)遍历集合时,可以使用hasNext方法判断是否还有下一个元素,避免盲目遍历。
(2)在迭代过程中,可以先调用hasNext方法判断是否有下一个元素,再调用next方法获取元素,以确保遍历过程的安全性。
(3)在处理大量数据时,可以使用hasNext方法来控制遍历进度,避免一次性加载到内存中。
5.示例代码以下是一个使用迭代器遍历集合的示例:```javaimport java.util.ArrayList;import java.util.Iterator;import java.util.List;public class IteratorExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}}```在这个示例中,我们创建了一个包含三个元素的ArrayList,并通过迭代器遍历集合。
C++迭代器的使用和操作总结

C++迭代器的使⽤和操作总结 迭代器是⼀种检查容器内元素并遍历元素的数据类型。
C++更趋向于使⽤迭代器⽽不是下标操作,因为标准库为每⼀种标准容器(如vector)定义了⼀种迭代器类型,⽽只⽤少数容器(如vector)⽀持下标操作访问容器元素。
⼀.定义和初始化 每种容器都定义了⾃⼰的迭代器类型,如vector:vector<int>::iterator iter; //定义⼀个名为iter的变量 每种容器都定义了⼀对名为begin和en的函数,⽤于返回迭代器。
下⾯对迭代器进⾏初始化操作:vector<int> ivec;vector<int>::iterator iter1=ivec.bengin(); //将迭代器iter1初始化为指向ivec容器的第⼀个元素vector<int>::iterator iter2=ivec.end(); //将迭代器iter2初始化为指向ivec容器的最后⼀个元素的下⼀个位置 注意end并不指向容器的任何元素,⽽是指向容器的最后元素的下⼀位置,称为超出末端迭代器。
如果vector为空,则begin返回的迭代器和end返回的迭代器相同。
⼀旦向上⾯这样定义和初始化,就相当于把该迭代器和容器进⾏了某种关联,就像把⼀个指针初始化为指向某⼀空间地址⼀样。
⼆.常⽤操作 下⾯列出了迭代器的常⽤运算操作:*iter //对iter进⾏解引⽤,返回迭代器iter指向的元素的引⽤iter->men //对iter进⾏解引⽤,获取指定元素中名为men的成员。
等效于(*iter).men++iter //给iter加1,使其指向容器的下⼀个元素iter++--iter //给iter减1,使其指向容器的前⼀个元素iter--iter1==iter2 //⽐较两个迭代器是否相等,当它们指向同⼀个容器的同⼀个元素或者都指向同同⼀个容器的超出末端的下⼀个位置时,它们相等iter1!=iter2 假设已经声明⼀个vector<int>的ivec容器,下⾯⽤迭代器来遍历ivec容器,把其每个元素重置为0:for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)*iter=0; 在C++定义的容器类型中,只有vector和queue容器提供迭代器算数运算和除!=和==之外的关系运算:iter+n //在迭代器上加(减)整数n,将产⽣指向容器中钱前⾯(后⾯)第n个元素的迭代器。
iterator方法

iterator方法标题:追寻 iterator 的足迹引言:在编程世界中,我们经常会遇到需要处理集合元素的情况。
为了更高效地处理这些集合,我们需要使用到 iterator 这一神奇的工具。
那么,什么是 iterator 呢?它又如何帮助我们更好地操控集合呢?让我们一起来追寻 iterator 的足迹,揭开它的神秘面纱。
1. iterator 的定义与作用Iterator(迭代器)是一种用于遍历集合的接口,它提供了一种统一的访问集合元素的方法。
通过使用 iterator,我们可以按照特定的顺序逐个访问集合中的元素,而不需要了解集合的内部结构。
这样,我们就可以更加方便地对集合进行操作了。
2. iterator 的使用方法使用 iterator 非常简单。
我们只需要通过调用集合的 iterator 方法,就可以获取到一个 iterator 对象。
然后,我们就可以使用该对象的各种方法来遍历集合了。
不同的编程语言可能会有不同的iterator 实现方式,但基本的使用方法是相似的。
3. iterator 的遍历方式iterator 提供了多种遍历方式,以满足不同的需求。
最常见的是使用 while 循环结合 hasNext 和 next 方法来遍历集合。
通过判断hasNext 方法的返回值,我们可以确定是否还有下一个元素可供访问。
而 next 方法则可以返回当前位置的元素,并将 iterator 移动到下一个位置。
4. iterator 的优势与局限使用 iterator 遍历集合具有多个优势。
首先,iterator 可以将集合的内部结构与遍历过程解耦,使得代码更加清晰易读。
其次,iterator 可以在遍历过程中对集合进行修改,而不会引发异常。
然而,iterator 也存在一些局限性,比如无法逆向遍历集合、无法并发访问等。
在使用 iterator 时,我们需要根据具体情况选择合适的遍历方式。
5. iterator 的应用场景iterator 不仅仅用于遍历集合,它还可以应用于其他许多场景。
C语言中的迭代与迭代器

C语言中的迭代与迭代器迭代(Iteration)是程序中常用的一种控制流程方式,它让程序能够重复执行一段代码块,从而达到对一组数据或集合进行处理的目的。
在C语言中,迭代常常与循环语句结合使用,例如for循环和while循环。
迭代器(Iterator)则是一种辅助工具,它提供了对数据集合中元素进行遍历和访问的方法。
C语言中的迭代主要通过循环语句来实现。
常见的循环语句有for循环、while循环和do-while循环。
它们都允许程序重复执行一段代码块,直到满足某个终止条件。
首先,我们来看看for循环。
for循环由一个初始化表达式、一个循环条件表达式和一个迭代表达式组成。
其中,初始化表达式在循环开始前执行一次,循环条件表达式在每次迭代前进行判断,如果为真则执行循环体,执行完循环体后再执行迭代表达式。
下面是for循环的一般形式:```cfor (初始化表达式; 循环条件表达式; 迭代表达式) {// 循环体}```接下来是while循环和do-while循环。
while循环只有一个循环条件表达式,它在每次迭代前进行判断,如果为真则执行循环体。
而do-while循环则是先执行一次循环体,然后再进行循环条件的判断,如果为真则继续执行循环体,否则循环结束。
下面是它们的一般形式:```cwhile (循环条件表达式) {// 循环体}do {// 循环体} while (循环条件表达式);```这些循环语句可以让我们在程序中重复执行一段代码块,实现对数据的迭代处理。
但是有时我们可能需要更灵活、更高级的迭代方式,这就引入了迭代器的概念。
迭代器是一种抽象的数据类型,它提供了一组接口,用于遍历和访问数据集合中的元素。
在C语言中,我们可以利用指针来实现迭代器的功能。
通过定义一个指针,我们可以按照一定的规则遍历数组或其他数据结构中的元素。
以数组为例,我们可以通过指针来遍历数组中的元素。
假设有一个整型数组arr,我们可以定义一个指针p指向数组的第一个元素,并通过不断移动指针的位置来遍历整个数组。
C#设计模式系列:迭代器模式(Iterator)

C#设计模式系列:迭代器模式(Iterator) 迭代器模式把对象的职责分离,职责分离可以最⼤限度减少彼此之间的耦合程度,从⽽建⽴⼀个松耦合的对象。
职责分离的要点是对被分离的职责进⾏封装,并以抽象的⽅式建⽴彼此之间的关系。
1、迭代器模式简介1.1>、定义 迭代器模式提供⼀种⽅法可以顺序访问聚合对象中各个元素,但⼜不暴露该对象的内部表⽰。
1.2>、使⽤频率 ⾼2、迭代器模式结构2.1>、结构图2.2>、参与者 迭代器模式参与者: ◊ Iterator:迭代器定义访问和遍历元素的接⼝ ◊ ConcreteIterator ° 具体迭代器实现迭代器接⼝ ° 对该聚合遍历时跟踪当前位置 ◊ Aggregate:聚合定义创建Iterator对象的接⼝ ◊ ConcreteAggregate:具体聚合,实现相应迭代器的接⼝,返回具体迭代器的⼀个适当的实例。
在迭代器模式中,ConcreteAggregate通过Aggregate定义的接⼝得到Iterator,并且这是⼀个ConcreteIterator,该ConcreteIterator具体实现了对ConcreteAggregate的访问与遍历的⽅法。
通过ConcreteIterator可以访问并使⽤集合中的元素。
3、迭代器模式结构实现 Iterator.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.IteratorPattern.Structural{public abstract class Iterator{public abstract object First();public abstract object Next();public abstract bool IsDone();public abstract object CurrentItem();}} Aggregate.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.IteratorPattern.Structural{public abstract class Aggregate{public abstract Iterator CreateIterator();}} ConcreteAggregate.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace DesignPatterns.IteratorPattern.Structural{public class ConcreteAggregate : Aggregate{private ArrayList _items = new ArrayList();public override Iterator CreateIterator(){return new ConcreteIterator(this);}public int Count{get { return _items.Count; }}public object this[int index]{get { return _items[index]; }set { _items.Insert(index, value); }}}} ConcreteIterator.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.IteratorPattern.Structural{public class ConcreteIterator : Iterator{private ConcreteAggregate _aggregate;private int _current = 0;public ConcreteIterator(ConcreteAggregate aggregate) {this._aggregate = aggregate;}public override object First(){return _aggregate[0];}public override object Next(){object ret = null;if (_current < _aggregate.Count - 1){ret = _aggregate[++_current];}return ret;}public override object CurrentItem(){return _aggregate[_current];}public override bool IsDone(){return _current >= _aggregate.Count;}}} Program.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using DesignPatterns.IteratorPattern.Structural;namespace DesignPatterns.IteratorPattern{class Program{static void Main(string[] args){ConcreteAggregate a = new ConcreteAggregate();a[0] = "Item A";a[1] = "Item B";a[2] = "Item C";a[3] = "Item D";ConcreteIterator i = new ConcreteIterator(a);Console.WriteLine("Iterating over collection:");object item = i.First();while (item != null){Console.WriteLine(item);item = i.Next();}}}} 运⾏输出:Iterating over collection:Item AItem BItem CItem D请按任意键继续. . .4、迭代器模式实践应⽤ 在迭代器模式的设计中,有两种具体的实现⽅式,分别为外禀迭代器和内禀迭代器。
C++迭代器iterator详解

C++迭代器iterator详解⽬录1.迭代器分类1)正向迭代器2)常量正向迭代器3)反向迭代器4)常量反向迭代器2.迭代器⽤法⽰例3.迭代器:++it与it++哪个好?(1)前置返回⼀个引⽤,后置返回⼀个对象(2)前置不会产⽣临时对象,后置必须产⽣临时对象,临时对象会导致效率降低4.迭代器的功能分类5.迭代器的辅助函数总结1.迭代器分类要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进⾏。
迭代器是⼀个变量,相当于容器和操纵容器的算法之间的中介。
迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。
从这⼀点上看,迭代器和指针类似。
迭代器按照定义⽅式分成以下四种。
1) 正向迭代器定义:容器类名::iterator 迭代器名;2) 常量正向迭代器定义:容器类名::const_iterator 迭代器名;3) 反向迭代器定义:容器类名::reverse_iterator 迭代器名;4) 常量反向迭代器定义:容器类名::const_reverse_iterator 迭代器名;2.迭代器⽤法⽰例通过迭代器可以读取它指向的元素,*迭代器名就表⽰迭代器指向的元素。
通过⾮常量迭代器还能修改其指向的元素。
迭代器都可以进⾏++操作。
反向迭代器和正向迭代器的区别在于:(1)对正向迭代器进⾏++操作时,迭代器会指向容器中的后⼀个元素;(2)⽽对反向迭代器进⾏++操作时,迭代器会指向容器中的前⼀个元素。
下⾯的程序演⽰了如何通过迭代器遍历⼀个 vector 容器中的所有元素。
#include <iostream>#include <vector>using namespace std;int main(){vector<int> vec; //v是存放int类型变量的可变长数组,开始时没有元素//vector 容器有多个构造函数,如果⽤⽆参构造函数初始化,则容器⼀开始是空的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++ 迭代器基础介绍迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。
迭代器就如同一个指针。
事实上,C++的指针也是一种迭代器。
但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。
例如,一个数组索引,也可以认为是一种迭代器。
除了使用下标来访问vector 对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。
迭代器是一种检查容器内元素并遍历元素的数据类型。
标准库为每一种标准容器(包括vector)定义了一种迭代器类型。
迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。
因为迭代器对所有的容器都适用,现代C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector 类型也是这样。
容器的iterator 类型每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter;这符语句定义了一个名为iter 的变量,它的数据类型是vector<int> 定义的iterator 类型。
每个标准库容器类型都定义了一个名为iterator 的成员,这里的iterator 与迭代器实际类型的含义相同。
术语:迭代器和迭代器类型程序员首次遇到有关迭代器的术语时可能会困惑不解,原因之一是由于同一个术语iterator 往往表示两个不同的事物。
一般意义上指的是迭代器的概念;而具体而言时指的则是由容器定义的具体的iterator 类型,如vector<int>。
重点要理解的是,有许多用作迭代器的类型,这些类型在概念上是相关的。
若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素的值),我们就称这种类型为迭代器。
各容器类都定义了自己的iterator 类型,用于访问容器内的元素。
换句话说,每个容器都定义了一个名为iterator 的类型,而这种类型支持(概念上的)迭代器的各种操作。
begin 和end 操作每种容器都定义了一对命名为begin 和end 的函数,用于返回迭代器。
如果容器中有元素的话,由begin 返回的迭代器指向第一个元素:vector<int>::iterator iter = ivec.begin();上述语句把iter 初始化为由名为vector 操作返回的值。
假设vector 不空,初始化后,iter 即指该元素为ivec[0]。
由end 操作返回的迭代器指向vector 的“末端元素的下一个”。
“超出末端迭代器”(off-the-end iterator)。
表明它指向了一个不存在的元素。
如果vector 为空,begin 返回的迭代器与end 返回的迭代器相同。
由end 操作返回的迭代器并不指向vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector 中所有元素。
vector 迭代器的自增和解引用运算迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。
迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:*iter = 0;解引用操作符返回迭代器当前所指向的元素。
假设iter 指向vector 对象ivec 的第一元素,那么*iter 和ivec[0] 就是指向同一个元素。
上面这个语句的效果就是把这个元素的值赋为0。
迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。
从逻辑上说,迭代器的自增操作和int 型对象的自增操作类似。
对int 对象来说,操作结果就是把int 型值“加1”,而对迭代器对象则是把容器中的迭代器“向前移动一个位置”。
因此,如果iter 指向第一个元素,则++iter 指向第二个元素。
由于end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
迭代器的其他操作另一对可执行于迭代器的操作就是比较:用== 或!= 操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。
迭代器应用的程序示例假设已声明了一个vector<int> 型的ivec 变量,要把它所有元素值重置为0,可以用下标操作来完成:// reset all the elements in ivec to 0for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)ivec[ix] = 0;上述程序用for 循环遍历ivec 的元素,for 循环定义了一个索引ix ,每循环迭代一次ix 就自增1。
for 循环体将ivec 的每个元素赋值为0。
更典型的做法是用迭代器来编写循环:// equivalent loop using iterators to reset all the elements in ivec to 0for (vector<int>::iterator iter = ivec.begin();iter !=ivec.end(); ++iter)*iter = 0; // set element to which iter refers to 0for 循环首先定义了iter,并将它初始化为指向ivec 的第一个元素。
for 循环的条件测试iter 是否与end 操作返回的迭代器不等。
每次迭代iter 都自增1,这个for 循环的效果是从ivec 第一个元素开始,顺序处理vector 中的每一元素。
最后,iter 将指向ivec 中的最后一个元素,处理完最后一个元素后,iter 再增加1,就会与end 操作的返回值相等,在这种情况下,循环终止。
for 循环体内的语句用解引用操作符来访问当前元素的值。
和下标操作符一样,解引用操作符的返回值是一个左值,因此可以对它进行赋值来改变它的值。
上述循环的效果就是把ivec 中所有元素都赋值为0。
通过上述对代码的详细分析,可以看出这段程序与用下标操作符的版本达到相同的操作效果:从vector 的第一个元素开始,把vector 中每个元素都置为0。
本节给出的例子程序,如果vector 为空,程序是安全的。
如果ivec 为空,则begin 返回的迭代器不指向任何元素——由于没有元素,所以它不能指向任何元素。
在这种情况下,从begin 操作返回的迭代器与从end 操作返回的迭代器的值相同,因此for 语句中的测试条件立即失败。
const_iterator前面的程序用vector::iterator 改变vector 中的元素值。
每种容器类型还定义了一种名为const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。
当我们对普通iterator 类型解引用时,得到对某个元素的非const(2.5 节)。
而如果我们对const_iterator 类型解引用时,则可以得到一个指向const 对象的引用(2.4 节),如同任何常量一样,该对象不能进行重写。
例如,如果text 是vector<string> 类型,程序员想要遍历它,输出每个元素,可以这样编写程序:// use const_iterator because we won't change the elementsfor (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++iter)cout << *iter << endl; // print each element in text除了是从迭代器读取元素值而不是对它进行赋值之外,这个循环与前一个相似。
由于这里只需要借助迭代器进行读,不需要写,这里把iter 定义为const_iterator 类型。
当对const_iterator 类型解引用时,返回的是一个const 值。
不允许用const_iterator: 进行赋值for (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++ iter)*iter = " "; // error: *iter is const使用const_iterator 类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。
可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。
不要把const_iterator 对象与const 的iterator 对象混淆起来。
声明一个const 迭代器时,必须初始化迭代器。
一旦被初始化后,就不能改变它的值:vector<int> nums(10); // nums is nonconstconst vector<int>::iterator cit = nums.begin();*cit = 1; // ok: cit can change its underlying element++cit; // error: can't change the value of cit const_iterator 对象可以用于const vector 或非const vector,因为不能改写元素值。
const 迭代器这种类型几乎没什么用处:一旦它被初始化后,只能用它来改写其指向的元素,但不能使它指向任何其他元素。
const vector<int> nines(10, 9); // cannot change elements in nines// error: cit2 could change the element it refers to and nines is constconst vector<int>::iterator cit2 = nines.begin();// ok: it can't change an element value, so it can be used with a const vector<int>vector<int>::const_iterator it = nines.begin();*it = 10; // error: *it is const++it; // ok: it isn't const so we can change its value// an iterator that cannot write elementsvector<int>::const_iterator// an iterator whose value cannot changeconst vector<int>::iterator迭代器的算术操作除了一次移动迭代器的一个元素的增量操作符外,vector 迭代器(其他标准库容器迭代器很少)也支持其他的算术操作。