在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    147

    瀏覽量

    7010
  • python
    +關注

    關注

    56

    文章

    4801

    瀏覽量

    84861
  • 迭代器
    +關注

    關注

    0

    文章

    44

    瀏覽量

    4329
收藏 人收藏

    評論

    相關推薦

    人類首次“看到”引力波,一分鐘了解中子星&引力波

    組漫畫圖,用最輕松、通俗的方式解讀了這次大事件,保證你一分鐘就能恍然大悟!
    的頭像 發表于 10-19 16:13 ?3909次閱讀

    [貼圖]一分鐘的時間你的身邊都會出現什么變化?

    一分鐘的時間你的身邊都會出現什么變化?靜下心來想想一分鐘能干什么?一分鐘能跳繩200下,慢跑200米。一分鐘可以瀏覽5條微博,轉發3個貼子,回復2個評論,百度1首知道旋律卻記不起歌詞的
    發表于 12-02 15:33

    labview關于一分鐘內采集開關量01的計數

    各位大神,我想做個記錄一分鐘內采集到開關量0 的計數
    發表于 04-08 19:15

    一分鐘自動正反轉直流電機控制電路

    我要找個電路:12v直流電機,每一分鐘自動反轉
    發表于 10-07 18:07

    個按鍵板一分鐘不操作的話led燈就會變暗

    個按鍵板,一分鐘不操作的話,led燈就會變暗;操作的時候led燈亮度較高。 (不進掉電模式,省電模式也不進。)用51單片機怎么實現?
    發表于 08-29 15:15

    用MSP430定時一分鐘,怎么計算初值?

    用MSP430定時一分鐘,怎么計算那個初值
    發表于 08-08 10:45

    藍牙音箱的面板怎么實現一分鐘待機?

    個藍牙音箱的面板。4個按鍵,不按的話,一分鐘,要求led燈變暗;按鍵有操作的時候,led燈變亮。(led燈全程是開著的)(51核單片機 不能進入休眠狀態)。高人們指導下,應該怎么去做。
    發表于 10-22 04:36

    一分鐘帶你看懂公有云和私有云的區別

    私有云和公有云的顯著差別在于對數據的掌控。只需一分鐘,下面幾張圖就能讓你看懂公有云和私有云的本質區別。
    發表于 01-25 16:18 ?6.3w次閱讀

    HL配套C實驗例程一分鐘倒計時

    HL配套C實驗例程一分鐘倒計時,配合開發板學習效果更好。
    發表于 04-11 17:04 ?6次下載

    一分鐘看懂51控制的MT8880雙音頻收發的匯編程序及源代碼

    一分鐘看懂51控制的MT8880雙音頻收發的匯編程序及源代碼。
    發表于 05-29 11:15 ?3149次閱讀
    <b class='flag-5'>一分鐘</b>看懂51控制的MT8880雙音頻收發<b class='flag-5'>器</b>的匯編程序及源代碼

    一分鐘學會FastZigBee

    電子發燒友網站提供《一分鐘學會FastZigBee.pdf》資料免費下載
    發表于 10-17 10:38 ?0次下載
    <b class='flag-5'>一分鐘</b>學會FastZigBee

    一分鐘制作PCB的簡單方法

    盡管現在網上PCB制板已經非常快捷和便宜,甚至有的廠家提供免費測試板制作,但比起“一分鐘制板”來制作測試電路板,發送出去制板還是時間太長。
    的頭像 發表于 02-28 09:20 ?3483次閱讀

    超級最后一分鐘DIY情人節賀卡

    電子發燒友網站提供《超級最后一分鐘DIY情人節賀卡.zip》資料免費下載
    發表于 07-06 14:47 ?0次下載
    超級最后<b class='flag-5'>一分鐘</b>DIY情人節賀卡

    一分鐘看完看懂電機的接線方法

    今天給大家講解下,看懂電機的接線方法,一分鐘看完,看就懂!。 電機的接線方法無外乎以下兩種 1a星形接法(實物圖)
    發表于 03-31 15:40 ?3969次閱讀
    <b class='flag-5'>一分鐘</b>看完看懂電機的接線方法

    用現代移位寄存克服最后一分鐘的特征蠕變

    電子發燒友網站提供《用現代移位寄存克服最后一分鐘的特征蠕變.pdf》資料免費下載
    發表于 09-21 11:20 ?0次下載
    用現代移位寄存<b class='flag-5'>器</b>克服最后<b class='flag-5'>一分鐘</b>的特征蠕變
    主站蜘蛛池模板: 四虎国产永久在线精品免费观看| 中文字幕一区二区三区在线不卡| 老司机色网| 国产午夜精品一区二区| 我色综合| 一区一精品| free性欧美高清另类| 精品国产乱码一区二区三区| 全国男人的天堂网站| 四虎永久在线精品视频免费观看| 在线天堂资源| 资源种子在线观看| 欧美色图一区二区| 亚洲免费视频播放| 亚洲欧美视频一区二区| 很黄很暴力 很污秽的小说| 美女把尿口扒开让男人桶出水 | 美女三级在线| 欧美亚洲天堂网| 日本在线www| 人人人人凹人人爽人人澡| 四虎精品成人免费观看| 日本精品视频四虎在线观看| 久久99色| 丁香花五月天婷婷| 成年看片免费高清观看| 丁香八月婷婷| 日本黄色免费网址| 看久久| 久久久久女人精品毛片九一| 视频在线观看网站| jizz性欧美12| 亚洲精品欧洲久久婷婷99| 亚洲三级理论| 天堂激情| 色天使色婷婷在线影院亚洲| 色多多网| 欧美成人生活片| 两性色午夜视频免费播放| 国产做a爰片久久毛片a| 高清色黄毛片一级毛片|