当前位置:网站首页 > 技术博客 > 正文

迭代器iterator和listiterator



目录

迭代器(iterator)和指针(pointer)区别在哪?

什么是迭代器?迭代器有什么作用?

C++中STL和容器、迭代器、算法之间的关系

---------------------------------------------------------------------------

视频:28. 迭代器的分类(category)

https://www.zhihu.com/question/

===========================================

  https://blog.csdn.net/fyf/article/details/

自学习C++以来,一直对STL、容器、迭代器、算法甚是困惑。
参考一些资料,加上自己的理解,整理如下
如果说程序等于数据结构+算法,STL就是一个小程序库,之所以说小,是因为容器模板中常用的函数有限,其中一个个容器就是一种数据结构.算法通过迭代器对容器中的数据进行访问,即形成一个个小程序。
在使用容器之前首先要根据自己使用的数据集和将要对数据结构采取的访问模式,比如增删改查,决定使用STL中的何种容器类型。
一、容器类型:
这里写图片描述

二、迭代器:
我们使用容器的时候,迭代器是一个不可分割的部分。迭代器在STL中用来将算法和容器联系起来,起着一种胶着剂的作用。迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器是一种行为类似指针的对象,它提供类似指针的功能,对容器成员的内容进行访问。
注意:每个迭代器是和每一个容器绑定的。

vector <int> ::iterator iter;

三、容器模板中常用的算法:
assign() 赋值
empty() 容器为空则返回非0值
erase() 删除指定位置或指定范围内的元素
push_front() 从容器头部插入元素
push_back() 从容器尾部插入元素
pop_front() 删除第一个元素
pop_back() 删除最后一个元素
back() 返回最后一个元素的引用
front() 返回第一个元素的引用
begin() 返回指向第一个元素的游标
end() 返回指向最后一个元素后一个位置的游标
四、代码实现

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<algorithm>
using namespace std;
void Output(int i){
    cout<<i<<" ";
}
void main(){
    vector<int> ivect,ivect2,ivect3;//定义容器对象
    vector<int>::iterator iter;//定义迭代器
    ivect.push_back(10);
    ivect.push_back(14);
    ivect.push_back(1);
    ivect.push_back(12);
    ivect.push_back(7);
    cout<<"ivect 元素:"<<endl;
    for_each(ivect.begin(),ivect.end(),Output);//for_each(first,end,f)f是对从first到end每一个元素采区的操作
    sort(ivect.begin(),ivect.end());

    cout<<endl<<endl;
    cout<<"ivect 元素排序后:"<<endl;
    for_each(ivect.begin(),ivect.end(),Output);

    cout<<endl<<endl;
    cout<<"用迭代器 iterator来输出元素:"<<endl;
    for(iter=ivect.begin();iter!=ivect.end();++iter){
        cout<<*iter<<" ";
    }
    cout<<endl<<endl;
    system("pause");

}

运行结果:


————————————————
版权声明:本文为CSDN博主「爱编程的小屁孩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fyf/article/details/

 

  https://blog.csdn.net/phantomthief1412/article/details/

  https://www.zhihu.com/question/

迭代器实际上是对“遍历容器”这一操作进行了封装。

在编程中我们往往会用到各种各样的容器,但由于这些容器的底层实现各不相同,所以对他们进行遍历的方法也是不同的。例如,数组使用指针算数就可以遍历,但链表就要在不同节点直接进行跳转。

这是非常不利于代码重用的。例如你有一个简单的查找容器中最小值的函数findMin,如果没有迭代器,那么你就必须定义适用于数组版本的findMin和适用于链表版本的findMin,如果以后有更多容器需要使用findMin,那就只好继续添加重载……而如果每个容器又需要更多的函数例如findMax,sort,那简直就是重载地狱……

我们的救星就是迭代器啦!如果我们将这些遍历容器的操作都封装成迭代器,那么诸如findMin一类的算法就都可以针对迭代器编程而不是针对具体容器编程,工作量一下子就少了很多!

------------------------------------

如果只讨论 STL container 类的 iterator,它们其实都是一种泛型指针。C风格指针是属于 iterator 的一种的。iterator 根据功能做了更细的划分,STL 中的 iterator 分成了五类。

我觉得它们的区别:

    在范围上,pointer 属于 iterator 的一种(random access iterator)在功能上,iterator 有着比 pointer 更细的划分并对应能力不同的功能(重载不同的运算符)在行为上,iterator 比 pointer 更统一和良好的用法(更轻易使用 begin()、end()且不用担心越界)

------------------------------------

如果只讨论 STL container 类的 iterator,它们其实都是一种泛型指针。C风格指针是属于 iterator 的一种的。iterator 根据功能做了更细的划分,STL 中的 iterator 分成了五类。

我觉得它们的区别:

    在范围上,pointer 属于 iterator 的一种(random access iterator)在功能上,iterator 有着比 pointer 更细的划分并对应能力不同的功能(重载不同的运算符)在行为上,iterator 比 pointer 更统一和良好的用法(更轻易使用 begin()、end()且不用担心越界)

------------------------------------

迭代器概念的要点是,你可以抽象出如何遍历集合的问题,而仅依赖于标准的公开迭代器方法。 对于collection,用户不需要对如何存储元素有任何了解。

------------------------------------

迭代器就是用来迭代的,指针是指向某一内存空间的,很顾名思义吧

一个数组,用指针可以指向它的某一元素。而迭代器是按照特定的规则,对这个数组进行遍历操作的封装物

对迭代器的操作可以分为消耗迭代器与不消耗迭代器

------------------------------------

迭代器是仿指针的类模板。像是指针操作符,->,*,++ --封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为:根据不同类型的数据结构来实现不同的++,–等操作;

在设计模式中有一种模式叫迭代器模式。该模式提供不需要暴露某个容器的内部表现形式,完成遍历容器操作。STL算法中广泛使用迭代器参数。

通过迭代器,容器和算法可以有机的粘合在一起,我们基本上不需要考虑底层的实现就可以完成一些通用算法。使用迭代器算法后需要注意失效问题。

指针能指向函数,迭代器只能指向容器

------------------------------------

指针是迭代器的一种,迭代器是用于迭代集合的一种抽象类型,而指针是原生数组的迭代器

简单来说,这两个的关系就是一个是抽象,一个是具体,指针属于一种迭代器。
发布于 2021-04-19 16:00

------------------------------------

iterator是底层指针行为之上的一层抽象, 用来取代”指针直接操作“的方式.

例如:array与list利用指针算术运算查找下一个元素的行为不同,而采用iterator把底层指针操作抽象出来,可以使上述操作采用同样的方式完成.

------------------------------------

用指针需要依赖容器底层实现细节

ps:其实这也是一个design pattern,后来众多编程语言都在核心语言或库中引入了迭代器

------------------------------------


指针就是一个变量,迭代器是类模板,对指针进行了封装和抽象。

迭代器分为随机访问迭代器,前向双向迭代器,输入输出迭代器,不同的迭代适用于不同的容器,这是由容器的结构决定的,像随机迭代器只能用于内存连续的容器,这跟指针的行为比较类似

------------------------------------

指针属于迭代器的一种(指针可以用来遍历容器[数组])

迭代器有着比指针更细的划分并对应能力不同的功能(重载不同的运算符)

迭代器比指针更统一和良好的用法(更轻易使用begin()和end(),不用担心越界)。

迭代器不是指针,是类模板,表现的像指针。模拟了指针的一些功能,通过重载了指针的一些操作符,->,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作;

迭代器返回的是对象引用,而不是对象的值,cout只能输出迭代器使用 * 取值后的值,不能直接输出自身;

能一次访问容器中的各个元素,通过迭代器,容器和算法可以结合起来,对算法给与不用的迭代器,就可以对不同容器进行相同的操作。

指针能指向函数,迭代器不行,只能指向容器,指针只能指向某些特定容器。

迭代器使用后就释放了,不能再继续使用,指针能。

------------------------------------

两个完全不是一个东西。

指针就好像鼠标一样,迭代器跟医院叫号一样,指针可以随便移动,所以会有安全问题,迭代器内部管理了数组对象,当完成了一个任务才会呼叫下一个病人来看病,没有号子了就停止了,没有安全问题

------------------------------------

2.指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离

3.通过指针或者iterator都能够修改其指向的元素 通过上面这几点看,

两者真的很像,但是两者也有着下面的几个不同地方:

1)cout操作符可以直接输出指针的值,但是对迭代器进行在操作的时候会报错。通过看报错信息和头文件知道,迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。

2)指针能指向函数而迭代器不行,迭代器只能指向容器这就说明了迭代器和指针其实是完全不一样的概念来的。

指针是一种特殊的变量,它专门用来存放另一变量的地址,而迭代器只是参考了指针的特性进行设计的一种STL接口。

------------------------------------

------------------------------------

版权声明


相关文章:

  • html框架技术2024-11-23 18:30:03
  • android webview 源码2024-11-23 18:30:03
  • 黑客软件 黑客工具箱2024-11-23 18:30:03
  • 思科模拟器3560交换机2024-11-23 18:30:03
  • java匿名类和匿名内部类2024-11-23 18:30:03
  • 数字图像基本处理实验2024-11-23 18:30:03
  • 工具的种类和用途2024-11-23 18:30:03
  • 大小端区别2024-11-23 18:30:03
  • opencvfindcontours2024-11-23 18:30:03
  • vs2010断点调试2024-11-23 18:30:03