0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一分鐘了解C++迭代器

冬至子 ? 來源:鳴鳴鑼的小屋 ? 作者:Maxwell Luo ? 2023-07-22 09:55 ? 次閱讀

>>> 背景

最近遇到一個(gè)很有趣的問題,大概是信息技術(shù)類的中考試題,問題如下。正確答案是A,在python中整數(shù)是不可以使用for遍歷的,這一點(diǎn)可以立刻通過解釋器進(jìn)行驗(yàn)證。但是如果寫成(123, )則會(huì)在字面上被認(rèn)為是一個(gè)元組,又是可以通過for遍歷的。

圖片

圖片

圖片

python不能對(duì)整數(shù)使用for循環(huán)進(jìn)行遍歷,這是因?yàn)檎麛?shù)不是可迭代對(duì)象,這里就會(huì)涉及一個(gè)概念,即迭代器。

>>> 內(nèi)容

迭代器被引入的動(dòng)機(jī),就是為了解決不同數(shù)據(jù)容器的遍歷訪問方法不同的問題。通過引入迭代器,可以統(tǒng)一化容器的訪問,提高代碼的復(fù)用性,提高程序員的生活質(zhì)量。

那么我們以python這個(gè)迭代問題為引子,來講一講C++里面是如何實(shí)現(xiàn)迭代器的,并給出一個(gè)非常簡(jiǎn)單的迭代器實(shí)例。

我們首先來創(chuàng)建一個(gè)數(shù)據(jù)容器。這個(gè)數(shù)據(jù)容器基本上就是一個(gè)數(shù)組而已。這里刪除了其他的構(gòu)造方法,僅僅保留一個(gè)列表初始化方法,這樣我們能通過類似 MyArray< int > obj = { 1 , 2 , 3 }; 的方法快速創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象。

#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;
};

我們?cè)跀?shù)據(jù)類中嵌入了迭代器的定義,這樣數(shù)據(jù)類的引入也會(huì)緊跟迭代器的定義,不需要額外引入迭代器定義??梢钥吹剑粋€(gè)簡(jiǎn)單的迭代器就是實(shí)現(xiàn)了operator*,operator++,operator==和operator!=的類。通過這幾個(gè)功能,我們就能完成迭代器更迭、迭代器取值的基本功能。

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;
};
// ...
}

這里額外提一下,關(guān)于++i和i++的重載。++i返回的是左值,而且是自增之后的值,重載原型使用 Iterator& operator ++() 來表示。i++返回的是右值,而且是自增之前的值,所以需要保存一個(gè)自增前的對(duì)象副本用于返回,重載原型使用 const Iterator operator ++(int) ,這里原型使用int純粹是為了和++i的函數(shù)區(qū)分(重載只認(rèn)參數(shù)列表而不在乎返回值)。

除此之外,我們的數(shù)據(jù)類還應(yīng)該提供迭代器的起始位置和終止位置,也就是常見的begin()和end()方法。

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

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

完成上述工作之后,就可以用迭代器的方法來遍歷整個(gè)數(shù)組啦,甚至可以使用遍歷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


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6954
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4774

    瀏覽量

    84386
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    4296
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    [貼圖]一分鐘的時(shí)間你的身邊都會(huì)出現(xiàn)什么變化?

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

    labview關(guān)于一分鐘內(nèi)采集開關(guān)量01的計(jì)數(shù)

    各位大神,我想做個(gè)記錄一分鐘內(nèi)采集到開關(guān)量0 的計(jì)數(shù)。
    發(fā)表于 04-08 19:15

    一分鐘自動(dòng)正反轉(zhuǎn)直流電機(jī)控制電路

    我要找個(gè)電路:12v直流電機(jī),每一分鐘自動(dòng)反轉(zhuǎn)
    發(fā)表于 10-07 18:07

    個(gè)按鍵板一分鐘不操作的話led燈就會(huì)變暗

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

    用MSP430定時(shí)一分鐘,怎么計(jì)算初值?

    用MSP430定時(shí)一分鐘,怎么計(jì)算那個(gè)初值
    發(fā)表于 08-08 10:45

    藍(lán)牙音箱的面板怎么實(shí)現(xiàn)一分鐘待機(jī)?

    個(gè)藍(lán)牙音箱的面板。4個(gè)按鍵,不按的話,一分鐘,要求led燈變暗;按鍵有操作的時(shí)候,led燈變亮。(led燈全程是開著的)(51核單片機(jī) 不能進(jìn)入休眠狀態(tài))。高人們指導(dǎo)下,應(yīng)該怎么去做。
    發(fā)表于 10-22 04:36

    一分鐘帶你看懂公有云和私有云的區(qū)別

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

    HL配套C實(shí)驗(yàn)例程一分鐘倒計(jì)時(shí)

    HL配套C實(shí)驗(yàn)例程一分鐘倒計(jì)時(shí),配合開發(fā)板學(xué)習(xí)效果更好。
    發(fā)表于 04-11 17:04 ?6次下載

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

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

    一分鐘學(xué)會(huì)FastZigBee

    電子發(fā)燒友網(wǎng)站提供《一分鐘學(xué)會(huì)FastZigBee.pdf》資料免費(fèi)下載
    發(fā)表于 10-17 10:38 ?0次下載
    <b class='flag-5'>一分鐘</b>學(xué)會(huì)FastZigBee

    一分鐘制作PCB的簡(jiǎn)單方法

    盡管現(xiàn)在網(wǎng)上PCB制板已經(jīng)非??旖莺捅阋耍踔劣械膹S家提供免費(fèi)測(cè)試板制作,但比起“一分鐘制板”來制作測(cè)試電路板,發(fā)送出去制板還是時(shí)間太長(zhǎng)。
    的頭像 發(fā)表于 02-28 09:20 ?3282次閱讀

    超級(jí)最后一分鐘DIY情人節(jié)賀卡

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

    一分鐘看完看懂電機(jī)的接線方法

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

    用現(xiàn)代移位寄存克服最后一分鐘的特征蠕變

    電子發(fā)燒友網(wǎng)站提供《用現(xiàn)代移位寄存克服最后一分鐘的特征蠕變.pdf》資料免費(fèi)下載
    發(fā)表于 09-21 11:20 ?0次下載
    用現(xiàn)代移位寄存<b class='flag-5'>器</b>克服最后<b class='flag-5'>一分鐘</b>的特征蠕變