设为首页 加入收藏

TOP

C++迭代器失效的问题汇总(三)
2014-07-19 23:03:26 来源: 作者: 【 】 浏览:117
Tags:失效 问题 汇总

 

  总结:

  1、对于关联式容器(map, list, set)元素的删除,插入操作会导致指向该元素的迭代器失效,其他元素迭代器不受影响。

  2、对于顺序式容器(vector)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效。

  关于迭代器

  (1)特征与操作

  l 迭代器的基本特征有:

  解除--支持解除引用(dereference)操作,以便可以访问它引用的值。即,如果p是一个迭代器,则应该对*p和p->进行定义(似指针);

  赋值--可将一个迭代器赋给另一个迭代器。即,如果p和q都是迭代器,则应该对表达式p=q进行定义;

  比较--可将一个迭代器与另一个迭代器进行比较。即,如果p和q都是迭代器,则应该对表达式p==q和p!=q进行定义;

  遍历--可以使用迭代器来遍历容器中的元素,这可以通过为迭代器p定义++p和p++操作来实现。

  迭代器的操作有:

  读--通过解除引用*来间接引用容器中的元素值,例如x = *p;

  写--通过解除引用*来给容器中的元素赋值,例如*p = x;

  访问--通过下标和指向引用容器中的元素及其成员,例如p 和p->m

  迭代--利用增量和减量运算(++和--、+和-、+=和-=)在容器中遍历、漫游和跳跃,例如p++、--p、p+5、p-=8

  比较--利用比较运算符(==、!=、<、>、<=、>=)来比较两个迭代器是否相等或谁大谁小,例如if(p < q)……;、wihle(p != c.end())……;

  (2)分类

  根据迭代器所支持的操作不同,在STL中定义了如下5种迭代器:

  l 输入迭代器(input iterator)--用于读取容器中的信息,但不一定能够修改它。

  输入迭代器iter通过解除引用(即*iter),来读取容器中其所指向元素之值;

  为了使输入迭代器能够访问容器中的所有元素的值,必须使其支持(前/后缀格式的)++ 操作符;

  输入迭代器不能保证第二次遍历容器时,顺序不变;也不能保证其递增后,先前指向的值不变。即,基于输入迭代器的任何算法,都应该是单通(single-pass)的,不依赖于前一次遍历时的值,也不依赖于本次遍历中前面的值。

  可见输入迭代器是一种单向的只读迭代器,可以递增但是不能递减,而且只能读不能写。适用于单通只读型算法。

  l 输出迭代器(output iterator)--用于将信息传输给容器(修改容器中元素的值),但是不能读取。例如,显示器就是只能写不能读的设备,可用输出容器来表示它。也支持解除引用和++操作,也是单通的。所以,输出迭代器适用于单通只写型算法。

  l 前向迭代器(forward iterator正向迭代器)--只能使用++操作符来单向遍历容器(不能用--)。与I/O迭代器一样,前向迭代器也支持解除引用与++操作。与I/O迭代器不同的是,前向迭代器是多通的(multi-pass)。即,它总是以同样的顺序来遍历容器,而且迭代器递增后,仍然可以通过解除保存的迭代器引用,来获得同样的值。另外,前向迭代器既可以是读写型的,也可以是只读的。

  l 双向迭代器(bidirectional iterator)--可以用++和--操作符来双向遍历容器。其他与前向迭代器一样,也支持解除引用、也是多通的、也是可读写或只读的。

  l 随机访问迭代器(random access iterator)--可直接访问容器中的任意一个元素的双向迭代器。

  可见,这5种迭代器形成了一个层次结构:I/O迭代器(都可++遍历,但是前者只读/后者只写)最基本、前向迭代器可读写但只能++遍历、双向迭代器也可读写但能++/--双向遍历、随机迭代器除了能够双向遍历外还能够随机访问。

  (3)指针与迭代器

  既然迭代器是广义的指针,那么指针本身是不是迭代器呢?其实,指针满足所有迭代器的要求,所以,指针就是一种迭代器。

  迭代器是泛型算法的接口,而指针是迭代器。所以,各种STL算法,也可以使用指针,来对非标准容器(如数组)进行操作。即,利用指针做迭代器,可以将STL算法用于常规数组。

  例如排序函数sort:

  sort(Ran first, Ran last); // Ran表示随机访问迭代器

  对容器c为:

  sort(c.begin(), c.end());

  对数组a可以改为:(const int SIZE = 100; float a[SIZE];)

  sort(a, a + SIZE);

  又例如复制函数copy:

  copy(In first, In last, Out res); // In和Out分别表示输入和输出迭代器

  对容器c可为:(ostream_iterator out_iter(cout);)

  copy(c.begin(), c.end(), out_iter);

  对数组a可以改为:(const int SIZE = 100; float a[SIZE];)

  copy(a, a + SIZE, c.begin());

        

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ Primer的10.3.9单词转换 下一篇类似Common Lisp的多参数加法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)