0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一分钟了解C++迭代器

冬至子 来源:鸣鸣锣的小屋 作者:Maxwell Luo 2023-07-22 09:55 次阅读

>>> 背景

最近遇到一个很有趣的问题,大概是信息技术类的中考试题,问题如下。正确答案是A,在python中整数是不可以使用for遍历的,这一点可以立刻通过解释器进行验证。但是如果写成(123, )则会在字面上被认为是一个元组,又是可以通过for遍历的。

图片

图片

图片

python不能对整数使用for循环进行遍历,这是因为整数不是可迭代对象,这里就会涉及一个概念,即迭代器。

>>> 内容

迭代器被引入的动机,就是为了解决不同数据容器的遍历访问方法不同的问题。通过引入迭代器,可以统一化容器的访问,提高代码的复用性,提高程序员的生活质量。

那么我们以python这个迭代问题为引子,来讲一讲C++里面是如何实现迭代器的,并给出一个非常简单的迭代器实例。

我们首先来创建一个数据容器。这个数据容器基本上就是一个数组而已。这里删除了其他的构造方法,仅仅保留一个列表初始化方法,这样我们能通过类似 MyArray< int > obj = { 1 , 2 , 3 }; 的方法快速创建一个数据对象。

#include < iostream >
using namespace std;


template < typename T >
class MyArray final {
public:
    MyArray() = delete;
    MyArray(const MyArray&) = delete;
    MyArray(const MyArray&&) = delete;

    MyArray(const initializer_list< T > &v) {
        _size = v.size();
        _data_ptr = new T[_size];
        size_t i = 0;
        for (auto it : v) {
            *(_data_ptr + i) = it;
            ++i;
        }
    }
    ~MyArray() {delete [] _data_ptr;}


private:
    T* _data_ptr;
    size_t _size;
};

我们在数据类中嵌入了迭代器的定义,这样数据类的引入也会紧跟迭代器的定义,不需要额外引入迭代器定义。可以看到,一个简单的迭代器就是实现了operator*,operator++,operator==和operator!=的类。通过这几个功能,我们就能完成迭代器更迭、迭代器取值的基本功能。

template
class MyArray final {
public:
class Iterator {
public:
Iterator(T* _p) : _curr_ptr(_p) {}
Iterator(const Iterator& other) {
if (this != &other) {
this->_curr_ptr = other._curr_ptr;
}
}
T& operator*() const {
return *_curr_ptr;
}
Iterator& operator++() {
++_curr_ptr;
return *this;
}
const Iterator operator++(int) {
Iterator tmp(*this);
++_curr_ptr;
return tmp;
}
bool operator==(const Iterator& it) const {
return this->_curr_ptr == it._curr_ptr;
}
bool operator!=(const Iterator& it) const {
return !(this == it);
}
private:
T
_curr_ptr;
};
// ...
}

这里额外提一下,关于++i和i++的重载。++i返回的是左值,而且是自增之后的值,重载原型使用 Iterator& operator ++() 来表示。i++返回的是右值,而且是自增之前的值,所以需要保存一个自增前的对象副本用于返回,重载原型使用 const Iterator operator ++(int) ,这里原型使用int纯粹是为了和++i的函数区分(重载只认参数列表而不在乎返回值)。

除此之外,我们的数据类还应该提供迭代器的起始位置和终止位置,也就是常见的begin()和end()方法。

template
class MyArray final {
public:
class Iterator {
// ...
};

public:
// ...
Iterator begin() {
return Iterator(_data_ptr);
}
Iterator end() {
return Iterator(_data_ptr + _size);
}
// ...
};

完成上述工作之后,就可以用迭代器的方法来遍历整个数组啦,甚至可以使用遍历for语法。Enjoy!

int main() {
MyArray obj = {1, 2, 3};
for (auto it = obj.begin(); it != obj.end(); ++it) {
cout << *it << " ";
}
cout << endl;
for (auto v : obj) {
cout << v << " ";
}

return 0;

}


1 2 3
1 2 3


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83483
  • 迭代器
    +关注

    关注

    0

    文章

    43

    浏览量

    4274
收藏 人收藏

    评论

    相关推荐

    TC1728在擦除Flash时,STM中断会暂停一分钟然后恢复,请问是什么原因呢?

    TC1728在擦除Flash时,STM中断会暂停一分钟,然后恢复,请问是什么原因呢?
    发表于 02-02 12:15

    求助:长虹液晶电视LT3218 开机一分钟后黑屏,声音正常,换台也正常

    长虹液晶电视LT3218 开机一分钟后黑屏,声音正常,换台也正常,请问什么原因?望高手告知如何修理,谢谢。
    发表于 01-09 21:13

    [贴图]一分钟的时间你的身边都会出现什么变化?

    一分钟的时间你的身边都会出现什么变化?静下心来想想一分钟能干什么?一分钟能跳绳200下,慢跑200米。一分钟可以浏览5条微博,转发3个贴子,回复2个评论,百度1首知道旋律却记不起歌词的
    发表于 12-02 15:33

    如何用定时中断来控制28BYJ-48 步进电机一分钟

    如何用定时中断来控制28BYJ-48 步进电机一分钟
    发表于 05-05 20:17

    labview关于一分钟内采集开关量01的计数

    各位大神,我想做个记录一分钟内采集到开关量0 的计数
    发表于 04-08 19:15

    一分钟自动正反转直流电机控制电路

    我要找个电路:12v直流电机,每一分钟自动反转
    发表于 10-07 18:07

    个按键板一分钟不操作的话led灯就会变暗

    个按键板,一分钟不操作的话,led灯就会变暗;操作的时候led灯亮度较高。 (不进掉电模式,省电模式也不进。)用51单片机怎么实现?
    发表于 08-29 15:15

    读取寄存时会在几秒到一分钟内出现点误差

    一分钟内出现点误差。例如,我们希望寄存读取6,7,8,9等。它将读取6,7,6,8,9。或者当我们期望A,B,C,D,E时,它将读取A, B,F,
    发表于 01-14 10:41

    用MSP430定时一分钟,怎么计算初值?

    用MSP430定时一分钟,怎么计算那个初值
    发表于 08-08 10:45

    蓝牙音箱的面板怎么实现一分钟待机?

    个蓝牙音箱的面板。4个按键,不按的话,一分钟,要求led灯变暗;按键有操作的时候,led灯变亮。(led灯全程是开着的)(51核单片机 不能进入休眠状态)。高人们指导下,应该怎么去做。
    发表于 10-22 04:36

    xplayerdemo播放视频最长只能播放一分钟左右吗?

    对于板卡中包含的两个测试程序以及流媒体协议库有以下几个疑问:1.xplayerdemo播放视频最长只能播放一分钟左右2.xplayerdemo对于本地文件仅通过set source即播放,无需处理
    发表于 01-13 07:33

    让程序运行三分钟,停一分钟,循环下去,直到设置停止循环的位置

    本帖最后由 我想看看太阳 于 2022-6-9 11:52 编辑 让这个程序运行三分钟,停一分钟,循环下去,直到设置停止循环的位置,需要添加什么模块才能实现呢
    发表于 06-08 15:03

    AD7190连续转换模式采了一分钟数据后出现异常怎么解决?

    AD7190与stm32的SPI通讯,选择连续转换模式,开始读的数据都正常,ID寄存什么的都能正常读取。连续采了一分钟左右的数据后,数据寄存读出来的数据全是0,其他寄存
    发表于 12-01 07:47

    一分钟学会FastZigBee

    电子发烧友网站提供《一分钟学会FastZigBee.pdf》资料免费下载
    发表于 10-17 10:38 0次下载
    <b class='flag-5'>一分钟</b>学会FastZigBee

    一分钟看完看懂电机的接线方法

    今天给大家讲解一下,看懂电机的接线方法,一分钟看完,一看就懂!。 电机的接线方法无外乎以下两种 1a星形接法(实物图)
    发表于 03-31 15:40 249次阅读
    <b class='flag-5'>一分钟</b>看完看懂电机的接线方法