Effective STL :迭代器
1. iterator优先于const_iterator,reverse_iterator, const_reverse_iterator
iterator 类似于T*,const_iterator类似于const T*。
有些泛型算法时仅接受iterator类型的参数,例如insert, erase;
iterator到const_iterator or reverse_ iterator之间存在隐式转换;
reverse_ iterator到const_reverse_ iterator也可隐式转换;
但是无法从Const类型的迭代器到非const去转换,这和c++ 非泛型是一样的。
所以在iterator 和const_iterator做选择的时候,优先选择iterator;
同时避免混用以上不同类型的迭代器。
2. 使用distance和advance将容器的const_iterator转换成iterator
deque<int> d;
ConstIter ci;
...
Iter i(d.begin());
advance(i, distance<ConstIter>(i,ci));
//将i也当做const_iterator.移动i,使它指向ci的位置,
消耗的时间是线性的。所以以第一条作为自己优先选择,避免后续使用的麻烦
3. 正确理解由reverse_iterator的base()函数所产生的iterator的用法
vector<int> v;
v.reverse(5);
for(int i = 0; i < 5; i++)
{
v.push(i);
}
vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);
vector<int>::iterator i(ri.base());
//ri 指向的是 3,i指向的是4
//原因是begin和end与rbegin和rend之间的偏移
| 1 | 2 | 3 | 4 | 5 |
1. 如果在reverse_iterator ri 指定的位置上插入新元素,则只需要在ri.base()位置即可,
即对于插入操作而言,ri与ri.base是等价的,结果如下:
| 1 | 2 | 3 | 99 | 4 | 5 |
2. 如果reverse_iterator ri指定的位置上删除元素,那么需要在ri.base()位置前面进行操作
即对于插入操作而言,ri与ri.base是不等价的
那么该怎么写呢:
vector<int> v;
v.reverse(5);
for(int i = 0; i < 5; i++)
{
v.push(i);
}
vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);
v.erase(--ri.base());//vector和string无法编译,其他的可以erase参数类型是iterator iterator指向的是4
v.erase((++ri).base());//正确的方法

浙公网安备 33010602011771号