C++ 的STL中,迭代器那个指针为何++能指向下一个元素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 的STL中,迭代器那个指针为何++能指向下一个元素?相关的知识,希望对你有一定的参考价值。

list<int>::iterator p;

然后把p 给头指针,然后++就指向下一个元素。这是为何?

连续的数组,那么++还能说通。

不连续的链表,怎么也能++ ?

这个是迭代器的特征,list通过实现迭代器从而可以实现迭代concept。具体请参考《Generic programming and the STL》一书(第一篇的第一章),STL作为一个基本完备的数据操作集,其设计理念和依据都非常抽象,想要理解有一定的难度,而且单单拿出一个组件是无法明白它单独所具有的意义的,因此要系统的学习。
但是如果你只要求会用即可的话,那么你可以把他当做语言规范或者特性记下来,迭代器在行为上就是模仿指针,但是结构上是在模仿线性表的访问方式。
参考技术A STL中的迭代器把“++”这个运算符重载了,也就是重新定义了“++”的行为,而且每个容器中的行为定义是不同的,这样在不同的容器中都可以移动到下一个元素追问

重载?你是说,iterator是一个类,而不是普通的指针类型变量?

因为你说++重载,那iterator他是一个类咯?

追答

iterator当然是一个类,只是因为重载了++,*等运算符,所以用起来像指针了

追问

厉害 ,还有个问题能帮我看下么

http://zhidao.baidu.com/question/1574711307469322900.html?quesup2&oldq=1

追答

我估计我不会比那个正在回答你的人说得更清楚……

参考技术B i++是根据每个数据大小+1,这样原理。明白? 参考技术C 重载运算符?

stl中vector中erase后迭代器为啥会失效

在对容器进行改变结构性的操作后,
比如删除插入等操作..
原来得到的迭代器指针会出现某些错误
注意这里向量容器因用动态数组实现的,所以当你删除或者插入时候,元素位置发生变动,这时候你之前得到的迭代器尾或者头,不指向了不合法的位置,
保险的做法是在做着先改变以后在重新返回一次起始迭代器和结束迭代器
以上个人说法,不严谨的请自行过滤
参考技术A gcc
4.4是符合iso2003标准的编译器,而vc6不符合。——因该以gcc下能运行为标准,而非旧版vc
标准下v.erase输入参数是迭代指针,而&v[1]是一个int地址
补救做法,强制转换
1、v.erase(
static_cast
::iterator>(&v[1])
);
2、v.erase(
(vector
::iterator)(&v[1])
);
标准做法,迭代器操作
3、v.erase(
v.begin()+1
);
ps:另外for循环中的v[0]也因该是v[i]

以上是关于C++ 的STL中,迭代器那个指针为何++能指向下一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL list迭代器

C++ 提高教程 STL -容器算法迭代器初识

如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素

指向特定类型的 STL 容器样式和迭代器 (C++)

指向对象的指针映射上的迭代器作为关键 C++

C++ STL 基础及应用 迭代器