除了使用下标来访问vector对象
![](/icons/67764de.gif)
元素外
![](/icons/67764dou.gif)
标准库还提供了另
![](/icons/67764yi.gif)
种检测元素
![](/icons/67764de.gif)
思路方法:使用迭代器(iterator)
![](/icons/67764dou2.gif)
迭代器是
![](/icons/67764yi.gif)
种允许
![](/icons/67764chengxu.gif)
员检查容器内元素
![](/icons/67764dou.gif)
并实现元素遍历
![](/icons/67764de.gif)
数据类型
标准库为每
![](/icons/67764yi.gif)
种标准容器(包括vector)定义了
![](/icons/67764yi.gif)
种迭代器类型
![](/icons/67764dou2.gif)
迭代器类型提供了比下标操作更
![](/icons/67764yi.gif)
般化
![](/icons/67764de.gif)
思路方法:所有
![](/icons/67764de.gif)
标准库容器都定义了相应
![](/icons/67764de.gif)
迭代器类型
![](/icons/67764dou.gif)
而只有少数
![](/icons/67764de.gif)
容器支持下标操作
![](/icons/67764dou2.gif)
![](/icons/67764yinwei.gif)
迭代器对所有
![](/icons/67764de.gif)
容器都适用
![](/icons/67764dou.gif)
现代C
![](/icons/67764jiajia.gif)
![](/icons/67764chengxu.gif)
更倾向于使用迭代器而不是下标操作访问容器元素
![](/icons/67764dou.gif)
即使对支持下标操作
![](/icons/67764de.gif)
vector类型也这样
第11章具体讨论迭代器
![](/icons/67764de.gif)
工作原理
![](/icons/67764dou.gif)
但在完全了解它复杂
![](/icons/67764de.gif)
实现细节的前
![](/icons/67764dou.gif)
我们
![](/icons/67764yi.gif)
样可以先使用它
1. 容器
![](/icons/67764de.gif)
iterator类型
每种容器类型都定义了自己
![](/icons/67764de.gif)
迭代器类型
![](/icons/67764dou.gif)
如vector:
vector<
![](/icons/67764int.gif)
>::iterator iter;
这条语句定义了
![](/icons/67764yi.gif)
个名为iter
![](/icons/67764de.gif)
变量
![](/icons/67764dou.gif)
它
![](/icons/67764de.gif)
数据类型是由vector<
![](/icons/67764int.gif)
>定义
![](/icons/67764de.gif)
iterator类型
![](/icons/67764dou2.gif)
每个标准库容器类型都定义了
![](/icons/67764yi.gif)
个名为iterator
![](/icons/67764de.gif)
成员
![](/icons/67764dou.gif)
这里
![](/icons/67764de.gif)
iterator和迭代器实际类型
![](/icons/67764de.gif)
含义相同
术语:迭代器和迭代器类型
![](/icons/67764chengxu.gif)
员首次遇到有关迭代器
![](/icons/67764de.gif)
术语时可能会困惑不解
![](/icons/67764dou.gif)
产生困惑
![](/icons/67764de.gif)
原因的
![](/icons/67764yi.gif)
是由于本书中同
![](/icons/67764yi.gif)
个术语iterator表示两个区别
![](/icons/67764de.gif)
事物
![](/icons/67764dou2.gif)
![](/icons/67764yi.gif)
般性提及
![](/icons/67764de.gif)
是迭代器
![](/icons/67764de.gif)
概念;而特别提及
![](/icons/67764de.gif)
则是由容器定义
![](/icons/67764de.gif)
具体
![](/icons/67764de.gif)
iterator类型
![](/icons/67764dou.gif)
如vector<
![](/icons/67764int.gif)
>
重点要理解
![](/icons/67764de.gif)
是
![](/icons/67764dou.gif)
定义了许多用作迭代器
![](/icons/67764de.gif)
类型
![](/icons/67764dou.gif)
这些类型在概念上是相关
![](/icons/67764de.gif)
![](/icons/67764dou2.gif)
若
![](/icons/67764yi.gif)
种类型支持
![](/icons/67764yi.gif)
组确定
![](/icons/67764de.gif)
行为(这些行为允许
![](/icons/67764chengxu.gif)
员遍历容器内
![](/icons/67764de.gif)
元素
![](/icons/67764dou.gif)
并允许
![](/icons/67764chengxu.gif)
员访问这些元素值)
![](/icons/67764dou.gif)
我们就称这种类型为迭代器
区别
![](/icons/67764de.gif)
容器类定义了自己
![](/icons/67764de.gif)
iterator类型
![](/icons/67764dou.gif)
用于访问容器内
![](/icons/67764de.gif)
元素
![](/icons/67764dou2.gif)
换句话说
![](/icons/67764dou.gif)
每个容器定义了
![](/icons/67764yi.gif)
种名为iterator
![](/icons/67764de.gif)
类型
![](/icons/67764dou.gif)
而这种类型支持(概念上
![](/icons/67764de.gif)
)迭代器
![](/icons/67764de.gif)
各种行为
2. begin和end操作
每种容器都定义了
![](/icons/67764yi.gif)
对命名为begin和end
![](/icons/67764de.gif)
![](/icons/67764hanshu.gif)
![](/icons/67764dou.gif)
用于返回迭代器
![](/icons/67764dou2.gif)
如果容器中有元素
![](/icons/67764de.gif)
话
![](/icons/67764dou.gif)
由begin返回
![](/icons/67764de.gif)
迭代器指向第
![](/icons/67764yi.gif)
个元素:
vector<
![](/icons/67764int.gif)
>::iterator iter = ivec.begin
![](/icons/67764kh.gif)
;
上述语句把iter
![](/icons/67764chushi.gif)
化为由名为begin
![](/icons/67764de.gif)
vector操作返回
![](/icons/67764de.gif)
值
![](/icons/67764dou2.gif)
假设vector不空
![](/icons/67764dou.gif)
![](/icons/67764chushi.gif)
化后
![](/icons/67764dou.gif)
iter即指该元素为ivec[0]
由end操作返回
![](/icons/67764de.gif)
迭代器指向vector
![](/icons/67764de.gif)
“末端元素
![](/icons/67764de.gif)
下
![](/icons/67764yi.gif)
个”
![](/icons/67764dou2.gif)
通常称为超出末端迭代器(off-the-end iterator)
![](/icons/67764dou.gif)
表明它指向了
![](/icons/67764yi.gif)
个不存在
![](/icons/67764de.gif)
元素
![](/icons/67764dou2.gif)
如果vector为空
![](/icons/67764dou.gif)
begin返回
![](/icons/67764de.gif)
迭代器和end返回
![](/icons/67764de.gif)
迭代器相同
由end操作返回
![](/icons/67764de.gif)
迭代器并不指向vector中任何实际
![](/icons/67764de.gif)
元素
![](/icons/67764dou.gif)
相反
![](/icons/67764dou.gif)
它只是起
![](/icons/67764yi.gif)
个哨兵(sentinel)
![](/icons/67764de.gif)
作用
![](/icons/67764dou.gif)
表示我们已处理完vector中所有元素
3. vector迭代器
![](/icons/67764de.gif)
自增和解引用运算
迭代器类型定义了
![](/icons/67764yi.gif)
些操作来获取迭代器所指向
![](/icons/67764de.gif)
元素
![](/icons/67764dou.gif)
并允许
![](/icons/67764chengxu.gif)
员将迭代器从
![](/icons/67764yi.gif)
个元素移动到另
![](/icons/67764yi.gif)
个元素
迭代器类型可使用解引用操作符(*操作符)来访问迭代器所指向r 元素:
*iter = 0;
解引用操作符返回迭代器当前所指向
![](/icons/67764de.gif)
元素
![](/icons/67764dou2.gif)
假设iter指向vector对象ivec
![](/icons/67764de.gif)
第
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou.gif)
那么*iter和ivec[0]就是指向同
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou2.gif)
上面这个语句
![](/icons/67764de.gif)
效果就是把这个元素
![](/icons/67764de.gif)
值赋为0
迭代器使用自增操作符(1.4.1节)向前移动迭代器指向容器中下
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou2.gif)
从逻辑上说
![](/icons/67764dou.gif)
迭代器
![](/icons/67764de.gif)
自增操作和
![](/icons/67764int.gif)
型对象
![](/icons/67764de.gif)
自增操作类似
![](/icons/67764dou2.gif)
对
![](/icons/67764int.gif)
对象来说
![](/icons/67764dou.gif)
操作结果就是把
![](/icons/67764int.gif)
型值“加1”
![](/icons/67764dou.gif)
而对迭代器对象则是把容器中
![](/icons/67764de.gif)
迭代器“向前移动
![](/icons/67764yi.gif)
个位置”
![](/icons/67764dou2.gif)
因此
![](/icons/67764dou.gif)
如果iter指向第
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou.gif)
则
![](/icons/67764jiajia.gif)
iter指向第 2个元素
由于end操作返回
![](/icons/67764de.gif)
迭代器不指向任何元素
![](/icons/67764dou.gif)
因此不能对它进行解引用或自增操作
4. 迭代器
![](/icons/67764de.gif)
其他运算
另
![](/icons/67764yi.gif)
对可执行于迭代器
![](/icons/67764de.gif)
操作就是比较:用
![](/icons/67764dd.gif)
或!=操作符来比较两个迭代器
![](/icons/67764dou.gif)
如果两个迭代器对象指向同
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou.gif)
则它们相等
![](/icons/67764dou.gif)
否则就不相等
5. 迭代器应用
![](/icons/67764de.gif)
![](/icons/67764chengxu.gif)
举例
假设已声明了
![](/icons/67764yi.gif)
个vector<
![](/icons/67764int.gif)
>型
![](/icons/67764de.gif)
ivec变量
![](/icons/67764dou.gif)
要把它所有元素值重置为0
![](/icons/67764dou.gif)
可以用下标操作来完成:
// re
![](/icons/67764set.gif)
all the elements in ivec to 0
for (vector<
![](/icons/67764int.gif)
>::size_type ix = 0; ix != ivec.size
![](/icons/67764kh.gif)
;
![](/icons/67764jiajia.gif)
ix)
ivec[ix] = 0;
上述
![](/icons/67764chengxu.gif)
用for循环遍历ivec
![](/icons/67764de.gif)
元素
![](/icons/67764dou.gif)
for循环定义了
![](/icons/67764yi.gif)
个索引ix
![](/icons/67764dou.gif)
每循环迭代
![](/icons/67764yi.gif)
次ix就自增1
![](/icons/67764dou2.gif)
for循环体将ivec
![](/icons/67764de.gif)
每个元素赋值为0
更典型
![](/icons/67764de.gif)
做法是用迭代器来编写循环:
// equivalent loop using iterators to re
![](/icons/67764set.gif)
all the elements in ivec to 0
for (vector<
![](/icons/67764int.gif)
>::iterator iter = ivec.begin
![](/icons/67764kh.gif)
;
iter != ivec.end
![](/icons/67764kh.gif)
;
![](/icons/67764jiajia.gif)
iter)
*iter = 0; //
![](/icons/67764set.gif)
element to which iter refers to 0
for循环首先定义了iter
![](/icons/67764dou.gif)
并将它
![](/icons/67764chushi.gif)
化为指向ivec
![](/icons/67764de.gif)
第
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou2.gif)
for循环
![](/icons/67764de.gif)
条件测试iter是否和end操作返回
![](/icons/67764de.gif)
迭代器不等
![](/icons/67764dou2.gif)
每次迭代iter都自增1
![](/icons/67764dou.gif)
这个for循环
![](/icons/67764de.gif)
效果是从ivec第
![](/icons/67764yi.gif)
个元素开始
![](/icons/67764dou.gif)
顺序处理vector中
![](/icons/67764de.gif)
每
![](/icons/67764yi.gif)
元素
![](/icons/67764dou2.gif)
最后
![](/icons/67764dou.gif)
iter将指向ivec中
![](/icons/67764de.gif)
最后
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou.gif)
处理完最后
![](/icons/67764yi.gif)
个元素后
![](/icons/67764dou.gif)
iter再增加1
![](/icons/67764dou.gif)
就会和end操作
![](/icons/67764de.gif)
返回值相等
![](/icons/67764dou.gif)
在这种情况下
![](/icons/67764dou.gif)
循环终止
for循环体内
![](/icons/67764de.gif)
语句用解引用操作符来访问当前元素
![](/icons/67764de.gif)
值
![](/icons/67764dou2.gif)
和下标操作符
![](/icons/67764yi.gif)
样
![](/icons/67764dou.gif)
解引用操作符
![](/icons/67764de.gif)
返回值是
![](/icons/67764yi.gif)
个左值
![](/icons/67764dou.gif)
因此可以对它进行赋值来改变它
![](/icons/67764de.gif)
值
![](/icons/67764dou2.gif)
上述循环
![](/icons/67764de.gif)
效果就是把ivec中所有元素都赋值为0
通过上述对代码
![](/icons/67764de.gif)
详细分析
![](/icons/67764dou.gif)
可以看出这段
![](/icons/67764chengxu.gif)
和用下标操作符
![](/icons/67764de.gif)
版本达到相同
![](/icons/67764de.gif)
操作效果:从vector
![](/icons/67764de.gif)
第
![](/icons/67764yi.gif)
个元素开始
![](/icons/67764dou.gif)
把vector中每个元素都置为0
本节给出
![](/icons/67764de.gif)
例子
![](/icons/67764chengxu.gif)
和3.3.2节vector
![](/icons/67764de.gif)
下标操作
![](/icons/67764de.gif)
![](/icons/67764chengxu.gif)
![](/icons/67764yi.gif)
样
![](/icons/67764dou.gif)
如果vector为空
![](/icons/67764dou.gif)
![](/icons/67764chengxu.gif)
是安全
![](/icons/67764de.gif)
![](/icons/67764dou2.gif)
如果ivec为空
![](/icons/67764dou.gif)
则begin返回
![](/icons/67764de.gif)
迭代器不指向任何元素
![](/icons/67764dou.gif)
由于没有元素
![](/icons/67764dou.gif)
所以它不能指向任何元素——在这种情况下
![](/icons/67764dou.gif)
从begin操作返回
![](/icons/67764de.gif)
迭代器和从end操作返回
![](/icons/67764de.gif)
迭代器
![](/icons/67764de.gif)
值相同
![](/icons/67764dou.gif)
因此for语句中
![](/icons/67764de.gif)
测试条件立即失败
6. const_iterator
前面
![](/icons/67764de.gif)
![](/icons/67764chengxu.gif)
用vector::iterator改变vector中
![](/icons/67764de.gif)
元素值
![](/icons/67764dou2.gif)
每种容器类型还定义了
![](/icons/67764yi.gif)
种名为const_iterator
![](/icons/67764de.gif)
类型
![](/icons/67764dou.gif)
该类型只能访问容器内元素
![](/icons/67764dou.gif)
但不能改变其值
当我们对普通iterator类型解引用时
![](/icons/67764dou.gif)
得到对某个元素
![](/icons/67764de.gif)
非const引用(2.5节)
![](/icons/67764dou2.gif)
而如果我们对const_iterator类型解引用时
![](/icons/67764dou.gif)
则可以得到
![](/icons/67764yi.gif)
个指向const对象
![](/icons/67764de.gif)
引用(2.4节)
![](/icons/67764dou.gif)
如同任何常量
![](/icons/67764yi.gif)
样
![](/icons/67764dou.gif)
该对象不能进行重写
例如
![](/icons/67764dou.gif)
如果text是vector<
![](/icons/67764string.gif)
>类型
![](/icons/67764dou.gif)
![](/icons/67764chengxu.gif)
员想要遍历它
![](/icons/67764dou.gif)
输出每个元素,可以这样编写
![](/icons/67764chengxu.gif)
:
// use const_iterator because we won't change the elements
for (vector<
![](/icons/67764string.gif)
>::const_iterator iter = text.begin
![](/icons/67764kh.gif)
;
iter != text.end
![](/icons/67764kh.gif)
;
![](/icons/67764jiajia.gif)
iter)
cout << *iter << endl; // pr
![](/icons/67764int.gif)
each element in text
除了是从迭代器读取元素值而不是对它进行赋值的外
![](/icons/67764dou.gif)
这个循环和前
![](/icons/67764yi.gif)
个相似
![](/icons/67764dou2.gif)
由于这里只需要借助迭代器进行读
![](/icons/67764dou.gif)
不需要写
![](/icons/67764dou.gif)
这里把iter定义为const_iterator类型
![](/icons/67764dou2.gif)
当对const_iterator类型解引用时
![](/icons/67764dou.gif)
返回
![](/icons/67764de.gif)
是
![](/icons/67764yi.gif)
个const值
![](/icons/67764dou2.gif)
不允许用const_iterator进行赋值:
for (vector<
![](/icons/67764string.gif)
>::const_iterator iter = text.begin
![](/icons/67764kh.gif)
;
iter != text.end
![](/icons/67764kh.gif)
;
![](/icons/67764jiajia.gif)
iter)
*iter = " "; // error: *iter is const
使用const_iterator类型时
![](/icons/67764dou.gif)
我们可以得到
![](/icons/67764yi.gif)
个迭代器
![](/icons/67764dou.gif)
它自身
![](/icons/67764de.gif)
值可以改变
![](/icons/67764dou.gif)
但不能用来改变其所指向
![](/icons/67764de.gif)
元素
![](/icons/67764de.gif)
值
![](/icons/67764dou2.gif)
可以对迭代器进行自增以及使用解引用操作符来读取值
![](/icons/67764dou.gif)
但不能对该元素值赋值
不要把const_iterator对象和const
![](/icons/67764de.gif)
iterator对象混淆起来
![](/icons/67764dou2.gif)
声明
![](/icons/67764yi.gif)
个const迭代器时
![](/icons/67764dou.gif)
必须
![](/icons/67764chushi.gif)
化迭代器
![](/icons/67764dou2.gif)
![](/icons/67764yi.gif)
旦被
![](/icons/67764chushi.gif)
化后
![](/icons/67764dou.gif)
就不能改变它
![](/icons/67764de.gif)
值:
vector<
![](/icons/67764int.gif)
> nums(10); // nums is nonconst
const vector<
![](/icons/67764int.gif)
>::iterator cit = nums.begin
![](/icons/67764kh.gif)
;
*cit = 1; // ok: cit can change its underlying element
![](/icons/67764jiajia.gif)
cit; // error: can't change the value of cit
const_iterator对象可以用于const vector或非const vector
![](/icons/67764dou.gif)
![](/icons/67764yinwei.gif)
不能改写元素值
![](/icons/67764dou2.gif)
const迭代器这种类型几乎没什么用处:
![](/icons/67764yi.gif)
旦它被
![](/icons/67764chushi.gif)
化后
![](/icons/67764dou.gif)
只能用它来改写其指向
![](/icons/67764de.gif)
元素
![](/icons/67764dou.gif)
但不能使它指向任何其他元素:
const vector<
![](/icons/67764int.gif)
> nines(10, 9); // cannot change elements in nines
// error: cit2 could change the element it refers to and nines is const
const vector<
![](/icons/67764int.gif)
>::iterator cit2 = nines.begin
![](/icons/67764kh.gif)
;
// ok: it can't change an element value, so it can be used with a const vector<
![](/icons/67764int.gif)
>
vector<
![](/icons/67764int.gif)
>::const_iterator it = nines.begin
![](/icons/67764kh.gif)
;
*it = 10; // error: *it is const
![](/icons/67764jiajia.gif)
it; // ok: it isn't const so we can change its value
// an iterator that cannot write elements
vector<
![](/icons/67764int.gif)
>::const_iterator
// an iterator whose value cannot change
const vector<
![](/icons/67764int.gif)
>::iterator
习题
习题3.17 重做3.3.2节
![](/icons/67764de.gif)
习题
![](/icons/67764dou.gif)
用迭代器而不是下标操作来访问vector中
![](/icons/67764de.gif)
元素
习题3.18 编写
![](/icons/67764chengxu.gif)
来创建有10个元素
![](/icons/67764de.gif)
vector对象
![](/icons/67764dou2.gif)
用迭代器把每个元素值改为当前值
![](/icons/67764de.gif)
2倍
习题3.19 验证习题3.18
![](/icons/67764de.gif)
![](/icons/67764chengxu.gif)
![](/icons/67764dou.gif)
输出vector
![](/icons/67764de.gif)
所有元素
习题3.20 解释
![](/icons/67764yi.gif)
下在上几个习题
![](/icons/67764de.gif)
![](/icons/67764chengxu.gif)
实现中你用了哪种迭代器
![](/icons/67764dou.gif)
并介绍说明原因
习题3.20 何时使用const迭代器
![](/icons/67764de.gif)
?又在何时使用const_iterator?解释两者
![](/icons/67764de.gif)
区别
3.4.1 迭代器
![](/icons/67764de.gif)
算术操作
除了
![](/icons/67764yi.gif)
次移动迭代器
![](/icons/67764de.gif)
![](/icons/67764yi.gif)
个元素
![](/icons/67764de.gif)
增量操作符外
![](/icons/67764dou.gif)
vector
![](/icons/67764de.gif)
迭代器(很少有其他标准库容器迭代器)也支持其他
![](/icons/67764de.gif)
算术操作
![](/icons/67764dou2.gif)
这些操作称为迭代器算术操作(iterator arithmetic)
![](/icons/67764dou.gif)
包括:
l iter + n
iter - n
可以对迭代器对象加上或减去
![](/icons/67764yi.gif)
个整型值
![](/icons/67764dou2.gif)
这样做将产生
![](/icons/67764yi.gif)
个新
![](/icons/67764de.gif)
迭代器
![](/icons/67764dou.gif)
其位置在iter所指元素的前(加)或的后(减)n个元素
![](/icons/67764de.gif)
位置
![](/icons/67764dou2.gif)
加或减的后
![](/icons/67764de.gif)
结果必须指向iter所指vector中
![](/icons/67764de.gif)
某个元素
![](/icons/67764dou.gif)
或者是vector末端
![](/icons/67764de.gif)
后
![](/icons/67764yi.gif)
个元素
![](/icons/67764dou2.gif)
加上或减去
![](/icons/67764de.gif)
值
![](/icons/67764de.gif)
类型应该是vector
![](/icons/67764de.gif)
size_type或d
![](/icons/67764if.gif)
ference_type类型(参考下面
![](/icons/67764de.gif)
解释)
l iter1 - iter2
该表达式用来计算两个迭代器对象
![](/icons/67764de.gif)
距离
![](/icons/67764dou.gif)
该距离是名为d
![](/icons/67764if.gif)
ference_type
![](/icons/67764de.gif)
signed整数类型
![](/icons/67764de.gif)
值
![](/icons/67764dou.gif)
这里
![](/icons/67764de.gif)
d
![](/icons/67764if.gif)
ference_type类型类似于size_type类型
![](/icons/67764dou.gif)
也是由vector定义
![](/icons/67764de.gif)
![](/icons/67764dou2.gif)
d
![](/icons/67764if.gif)
ference_type是signed类型
![](/icons/67764dou.gif)
![](/icons/67764yinwei.gif)
减法运算可能产生负数
![](/icons/67764de.gif)
结果
![](/icons/67764dou2.gif)
该类型可以保证足够大以存储任何两个迭代器对象间
![](/icons/67764de.gif)
距离
![](/icons/67764dou2.gif)
iter1和iter2两者必须都指向同
![](/icons/67764yi.gif)
vector中
![](/icons/67764de.gif)
元素
![](/icons/67764dou.gif)
或者指向vector末端的后
![](/icons/67764de.gif)
下
![](/icons/67764yi.gif)
个元素
可以用迭代器算术操作来移动迭代器直接指向某个元素
![](/icons/67764dou.gif)
例如
![](/icons/67764dou.gif)
下面语句直接定位于vector
![](/icons/67764de.gif)
中间元素:
vector<
![](/icons/67764int.gif)
>::iterator mid = vi.begin
![](/icons/67764kh.gif)
+ vi.size
![](/icons/67764kh.gif)
/2;
上述代码用来
![](/icons/67764chushi.gif)
化mid
![](/icons/67764dou.gif)
使其指向vi中最靠近正中间
![](/icons/67764de.gif)
元素
![](/icons/67764dou2.gif)
这种直接计算迭代器
![](/icons/67764de.gif)
思路方法
![](/icons/67764dou.gif)
和用迭代器逐个元素自增操作到达中间元素
![](/icons/67764de.gif)
思路方法是等价
![](/icons/67764de.gif)
![](/icons/67764dou.gif)
但前者
![](/icons/67764de.gif)
效率要高得多
任何改变vector长度
![](/icons/67764de.gif)
操作都会使已存在
![](/icons/67764de.gif)
迭代器失效
![](/icons/67764dou2.gif)
例如
![](/icons/67764dou.gif)
在
![](/icons/67764diaoyong.gif)
push_back的后
![](/icons/67764dou.gif)
就不能再信赖指向vector
![](/icons/67764de.gif)
迭代器
![](/icons/67764de.gif)
值了
习题
习题3.22 如果采用下面
![](/icons/67764de.gif)
思路方法来计算mid会产生什么结果?
vector<
![](/icons/67764int.gif)
>::iterator mid = (vi.begin
![](/icons/67764kh.gif)
+ vi.end
![](/icons/67764kh.gif)
)/2;