C++指针与迭代器的区别
1、总的说:1)范围——指针属于迭代器的一种(指针可以用来遍历容器[数组])2)功能——迭代器有着比指针更细的划分并对应能力不同的功能(重载不同的运算符)比如正向迭代器,双向迭代器,随机迭代器(见迭代器划分)3)行为——迭代器比指针更统一和良好的用法(更轻易使用begin()和end(),不用担心越界)。2、迭代器:1)迭代器不是指针,是类模板,表现的像指针。模拟了指针的一些功能,通过重载了指针的
回答,虽然指针和迭代器很像,比方说都可以++,--去访问下一个(当然针对双向迭代器),都可以+n去访问某一个位置的(随机迭代器),都可以修改迭代器指向对象的值。但是迭代器与指针的完全不同的,就拿遍历来说,指针的++只是简单的去增加快大小的地址,这在支持随机迭代器的容器中是可行的,但是当去遍历list这种内存不连续的来说,就无法只通过简单的++来实现了,而迭代器是可以++访问任何容器的,这就表明了迭代器是一个类模板,只是采用了指针的思想去设计的,迭代器与算法相结合就可以去操作任何一种容器,而指针就是简单的记录地址的一个变量。第二呢,迭代器比指针有很细致的划分,分为不同的迭代器。第三迭代器返回的是一个类的引用,cout不能直接输出,只能输出迭代器指向的值,而指针是可以直接输出的。第四呢 是迭代器只能指向容器,但是无法指向函数
1、总的说:
1)范围——指针属于迭代器的一种(指针可以用来遍历容器[数组])
2)功能——迭代器有着比指针更细的划分并对应能力不同的功能(重载不同的运算符)
比如正向迭代器,双向迭代器,随机迭代器(见迭代器划分)
3)行为——迭代器比指针更统一和良好的用法(更轻易使用begin()和end(),不用担心越界)。
2、迭代器:
1)迭代器不是指针,是类模板,表现的像指针。模拟了指针的一些功能,通过重载了指针的一些操作符,->,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作;它只能指向容器,可以对容器提供统一同一的操作,但是指针就不行了,比如指针遍历vector时,vector底层是连续的内存,所以可以++pointer访问下一个,但是当遍历list的时候就不能直接++了,因为list不是连续的内存。而iterator就可以,都是++操作访问下一个。
充分说明迭代器时类模板这一概念
迭代器实际上是对“遍历容器”这一操作进行了封装。
在编程中我们往往会用到各种各样的容器,但由于这些容器的底层实现各不相同,所以对他们进行遍历的方法也是不同的。例如,数组使用指针算数就可以遍历,但链表就要在不同节点直接进行跳转。
这是非常不利于代码重用的。例如你有一个简单的查找容器中最小值的函数findMin,如果没有迭代器,那么你就必须定义适用于数组版本的findMin和适用于链表版本的findMin,如果以后有更多容器需要使用findMin,那就只好继续添加重载……而如果每个容器又需要更多的函数例如findMax,sort,那简直就是重载地狱……
我们的救星就是迭代器啦!如果我们将这些遍历容器的操作都封装成迭代器,那么诸如findMin一类的算法就都可以针对迭代器编程而不是针对具体容器编程,工作量一下子就少了很多!
至于指针,由于指针也可以用来遍历容器(数组),所以指针也可是算是迭代器的一种。但是指针还有其他功能,并不只局限于遍历数组。因为使用指针变量数组的操作太深入人心,c++stl中的迭代器就是刻意仿照指针来设计接口的
2)迭代器返回的是对象引用,而不是对象的值,cout只能输出迭代器使用 * 取值后的值,不能直接输出自身;
3)能一次访问容器中的各个元素,通过迭代器,容器和算法可以结合起来,对算法给与不用的迭代器,就可以对不同容器进行相同的操作,就是上述不同的findMin只需要在迭代器类中实现一次就好了
3、指针:
指针能指向函数,迭代器不行,只能指向容器,指针只能指向某些特定容器。
4、迭代器使用后就释放了,不能再继续使用,指针能。
更多推荐
所有评论(0)