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

目录

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

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

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

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

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

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

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

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

  https://blog.csdn.net/fyf18845165207/article/details/82695992

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

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

vector <int> ::iterator iter;

    1
    2

三、容器模板中常用的算法:
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<<"\t";
}
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<<"\t";
    }
    cout<<endl<<endl;
    system("pause");

}

运行结果:


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

 

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

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

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

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

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

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

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

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

至于指针,由于指针也可以用来遍历容器(数组),所以指针也可是算是迭代器的一种。但是指针还有其他功能,并不只局限于遍历数组。因为使用指针变量数组的操作太深入人心,c++stl中的迭代器就是刻意仿照指针来设计接口的
编辑于 2016-12-26 21:43

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

如果只讨论 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只能输出迭代器使用 * 取值后的值,不能直接输出自身;

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

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

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

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

两个完全不是一个东西。

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

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


1.指针和iterator都支持与整数进行+,-运算,而且其含义都是从当前位置向前或者向后移动n个位置

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

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

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

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

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

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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迭代器是一种设计模式,它允许你遍历容器中的元素,而不用暴露容器的内部实现细节。 在C++ STL中,迭代器是一种抽象的概念,它允许你遍历各种容器(例如vector、list、set等)中的元素,而不用关心容器的内部实现。STL中的迭代器是一个类,它定义了一些成员函数(例如++, --, *, ->等)来实现遍历容器中的元素。 通常,你可以使用STL中提供的迭代器来遍历容器中的元素,但是有时候你可能需要自定义一个迭代器来遍历自己定义的容器。在这种情况下,你需要实现自己的迭代器类,并提供类似STL迭代器的成员函数来实现遍历容器中的元素。 下面是一个简单的示例,展示如何实现一个自定义的迭代器类: ```cpp template <typename T> class MyIterator { public: typedef T value_type; typedef T* pointer; typedef T& reference; MyIterator(pointer ptr) : m_ptr(ptr) {} MyIterator& operator++() { ++m_ptr; return *this; } MyIterator operator++(int) { MyIterator tmp(m_ptr); ++m_ptr; return tmp; } reference operator*() const { return *m_ptr; } pointer operator->() const { return m_ptr; } bool operator==(const MyIterator& other) const { return m_ptr == other.m_ptr; } bool operator!=(const MyIterator& other) const { return !(*this == other); } private: pointer m_ptr; }; ``` 在这个示例中,我们定义了一个名为MyIterator的模板类。这个类有三个模板参数:value_type、pointer和reference,它们分别表示迭代器指向的元素类型、指针类型和引用类型。 MyIterator类有一个构造函数,它接受一个指向元素的指针,并将其存储为成员变量m_ptr。此外,这个类还实现了STL迭代器中常见的成员函数,例如operator++、operator*和operator->等。 现在,我们可以使用这个自定义的迭代器类来遍历我们自己定义的容器了。例如: ```cpp class MyContainer { public: typedef int value_type; typedef MyIterator<int> iterator; MyContainer() : m_data{1, 2, 3, 4, 5} {} iterator begin() { return iterator(&m_data[0]); } iterator end() { return iterator(&m_data[5]); } private: int m_data[5]; }; int main() { MyContainer container; for (auto it = container.begin(); it != container.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; } ``` 在这个示例中,我们定义了一个名为MyContainer的容器类,它包含一个数组m_data来存储元素。这个类还定义了两个成员函数begin和end,它们分别返回指向容器中第一个元素和最后一个元素之后的迭代器。 在main函数中,我们创建了一个MyContainer对象,并使用自定义的迭代器来遍历其中的元素。这个示例中的输出是1 2 3 4 5,它表明我们成功地遍历了容器中的所有元素。 总之,迭代器是一种非常有用的设计模式,它允许你遍历容器中的元素,而不用关心容器的内部实现细节。如果你需要自定义一个容器类,那么你也需要实现一个自定义的迭代器类来支持遍历容器中的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值