part4 4种迭代器
正向(从头至尾)遍历
对应于容器类 container<T> 的
iterator -> T*
const_ -> const T* // 所指元素为const, 而非自身为const
反向(从尾至头)遍历
reverse_
const_reverse_
(1) 关系
(2) 是否可相互转换
(3) 是否可混用
(4) 与 容器及其成员函数 之间的关系
特定形式的insert和erase, 只有1种迭代器可被容器接受
, 为什么?
item26: iterator优先于const_iterator/reverse_iterator/const_reverse_iterator
1 4种迭代器关系
(1) 隐式转换只有3种
iterator -> 加 const / reverse 特性
reverse_ 版本 -> 加 const 特性
() base()显式转换
: 去 reverse
特性
2 如何选择
(1) 有些版本的insert和erase
函数要求使用迭代器, 必须用iterator
, const和reverse型迭代器不满足要求
(2) item27中, 将const_iterator显式转换成iterator
的技术并不普遍适用, 且效率也不能保证
(3) 从reverse_iterator转换而来的iterator使用前可能需要调整(item28)
实践中, 可能
[1] 更多地面临 iterator与const_iterator之间的选择
ConstIter ci;
Iter i;
if(i == ci) // i 隐式转换为 const版本, 再与 ci 比较
[2] iterator与reverse_iterator之间的选择结果是显而易见
: 从头至尾遍历, 还是从尾至头遍历
选了reverse_iterator
, 又想调用
需要iterator
的容器成员函数时
用 base()转换
为一个iterator: 可能需要偏移(item28)
3 插/删时, cosnt 迭代器 "往往"没用,除非将其转换为iterator
item28 reverse_iterator的base()
成员函数所产生的iterator: 从正向遍历看, iterator 后偏1个位置
1 想在reverse_iterator ri所指位置上插入
=> 直接在ri.base()位置处插
以 vector 想象
2 想在reverse_iterator ri所指位置上删除
=> 要在 ri.base() (正向来看)前面的位置上删
=> ri 前置自增, 再取base(), 再删
vector<int>::reverse_iterator ri =
find(v.rbegin(), v.end(), 3);
// 对vector/string 之外的标准容器, ok;
// 对vector/string, 迭代器非指针时, 也ok;
// 迭代器即指针时, error, 原因: C和C++都规定了从函数返回的指针不应该被修改
v.erase(--ri.base() );
// 通用做法
v.erase((++ri).base() );