最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?反向迭代器模擬實(shí)現(xiàn)

 更新時(shí)間:2024年01月26日 12:01:45   作者:樊梓慕  
反向迭代器reverse_iterator是一種反向遍歷容器的迭代器,也就是從最后一個(gè)元素到第一個(gè)元素遍歷容器,本文主要介紹了C++?反向迭代器模擬實(shí)現(xiàn),感興趣的可以了解一下

前言

之前我們已經(jīng)模擬實(shí)現(xiàn)過(guò)vector、list等容器,但其中我們僅實(shí)現(xiàn)了普通迭代器與const迭代器,今天我們就來(lái)學(xué)習(xí)下反向迭代器的實(shí)現(xiàn)。

1.利用適配器的思想

我們知道stack、queue等不稱為容器,而被稱作『適配器 』,因?yàn)樗麄兊牡讓邮侨萜鱠eque,即只需要利用deque這個(gè)結(jié)構(gòu)來(lái)滿足stack、queue的特性,此時(shí)stack和queue就是一種適配器。

那反向迭代器是不是就是普通迭代器的一種適配呢?

反向迭代器需不需要我們從零開始寫呢?還是和適配器一樣,利用普通迭代器的結(jié)構(gòu)滿足反向迭代器的特性即可?這樣是不是比較方便?

  • rbegin()相當(dāng)于end()
  • rend()相當(dāng)于begin()
  • 反向迭代器++相當(dāng)于正向迭代器--
  • 其他操作* != ->和正向迭代器相同

那么我們?cè)侔胃咭粚樱?/strong>

每一種容器或適配器都要實(shí)現(xiàn)自己的反向迭代器,如果是這樣的話代碼會(huì)不會(huì)太冗余了,因?yàn)樗麄兊姆聪虻鞯倪壿嫸际窍嗤摹?/p>

所以我們可以利用模板參數(shù)、泛型來(lái)通過(guò)傳遞不同的模板參數(shù)來(lái)讓編譯器自己推演出對(duì)應(yīng)容器或適配器的反向迭代器即可。

反向迭代器類:

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
    typedef ReverseIterator<Iterator, Ref, Ptr> Self;

    Iterator cur;

    ReverseIterator(Iterator it)
        :cur(it)
    {}

    Self& operator++()//前置++
    {
        --cur;
        return *this;
    }

    Self operator++(int)//后置++
    {
        Iterator tmp = cur;
        --cur;
        return tmp;
    }

    Self& operator--()//前置--
    {
        ++cur;
        return *this;
    }

    Self operator--(int)//后置--
    {
        Iterator tmp = cur;
        ++cur;
        return tmp;
    }

    Ref operator*()//解引用
    {
        Iterator tmp = cur;
        --tmp;
        return *tmp;
    }

    Ptr operator->()
    {
        return &(operator*());
    }

    bool operator!=(const Self& s)
    {
        return cur != s.cur;
    }

    bool operator==(const Self& s)
    {
        return cur == s.cur;
    }

};

2.有關(guān)operator*注意 

為了其對(duì)稱性,使得rbegin()等價(jià)于end(),rend()等價(jià)于begin()。

  • 但由于end是指向最后一個(gè)元素的『 下一個(gè)位置』,而rbegin由end適配得到,所以反向迭代器中的operator*()不是返回迭代器的當(dāng)前位置的數(shù)據(jù),而是返回迭代器當(dāng)前位置的『 前一個(gè)位置』的數(shù)據(jù)。

即如果我們需要返回當(dāng)前位置的數(shù)據(jù),可以將rbegin()由--end(),rend()由--begin()進(jìn)行適配即可。 

3.利用vector來(lái)舉例說(shuō)明

template<class T>
class vector
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
    typedef ReverseIterator<const_iterator, T&, T*> const_reverse_iterator;

    reverse_iterator rbegin()
    {
        return reverse_iterator(end());
    }
    reverse_iterator rend()
    {
        return reverse_iterator(begin());
    }
    const_reverse_iterator rbegin() const
    {
        return const_reverse_iterator(end());
    }
    const_reverse_iterator rend() const
    {
        return const_reverse_iterator(begin());
    }

    iterator begin()
    {
        return _start;
    }
    iterator end()
    {
        return _finish;
    }
    const_iterator begin() const
    {
        return _start;
    }
    const_iterator end() const
    {
        return _finish;
    }

    vector(){}
    vector(const vector<T>& v);
    template <class InputIterator>
    vector(InputIterator first, InputIterator last);
    vector(size_t n, const T& val = T());
    vector(int n, const T& val = T());
    vector<T>& operator= (vector<T> v);
    ~vector();
    size_t size() const;
    size_t capacity() const;
    void reserve(size_t n);
    void resize(size_t n, const T& val = T());
    T& operator[](size_t pos);
    const T& operator[](size_t pos)const;
    void push_back(const T& x);
    void pop_back();
    void swap(vector<T>& v);
    iterator insert(iterator pos, const T& x);
    iterator erase(iterator pos);
private:
    iterator _start = nullptr; // 指向數(shù)據(jù)塊的開始
    iterator _finish = nullptr; // 指向有效數(shù)據(jù)的尾
    iterator _endOfStorage = nullptr; // 指向存儲(chǔ)容量的尾
};

如圖:根據(jù)模板參數(shù)int和reverse_iterator可以推演出該反向迭代器的各個(gè)模板參數(shù)類型,在反向迭代器類中寫一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)就是利用的適配器思想,將普通迭代器iterator傳遞給反向迭代器ReverseIterator,然后利用普通迭代器iterator的++或--方法實(shí)現(xiàn)反向迭代器。

同樣的類比到List中:

 到此這篇關(guān)于C++ 反向迭代器模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ 反向迭代器 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VC下實(shí)現(xiàn)fopen支持中文的方法

    VC下實(shí)現(xiàn)fopen支持中文的方法

    這篇文章主要介紹了VC下實(shí)現(xiàn)fopen支持中文的方法,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言自定義類型之聯(lián)合和枚舉解讀

    C語(yǔ)言自定義類型之聯(lián)合和枚舉解讀

    聯(lián)合體共享內(nèi)存,大小由最大成員決定,遵循對(duì)齊規(guī)則;枚舉類型列舉可能值,提升可讀性和類型安全性,兩者在C語(yǔ)言中用于優(yōu)化內(nèi)存和程序效率
    2025-08-08
  • C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版

    C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++ 單例模式的詳解及實(shí)例

    C++ 單例模式的詳解及實(shí)例

    這篇文章主要介紹了C++ 單例模式的詳解及實(shí)例的相關(guān)資料,這里對(duì)單例中的懶漢模式和餓漢模式進(jìn)行實(shí)現(xiàn)和比較,需要的朋友可以參考下
    2017-07-07
  • C語(yǔ)言之單鏈表的插入、刪除與查找

    C語(yǔ)言之單鏈表的插入、刪除與查找

    本篇文章主要介紹了從單鏈表的創(chuàng)建、遍歷到節(jié)點(diǎn)的插入、刪除與查找功能的實(shí)現(xiàn),有需要的朋友可以參考下
    2015-07-07
  • 獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例

    獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例

    下面小編就為大家?guī)?lái)一篇獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • C++教程之變量的作用域與生命周期詳解

    C++教程之變量的作用域與生命周期詳解

    在C++編程中,變量的作用域和生命周期是非常重要的概念。了解這些概念可以幫助開發(fā)人員編寫更好的代碼并避免錯(cuò)誤。在本文中,我們將探討C++中變量的作用域和生命周期,以及如何正確地使用它們
    2023-04-04
  • 詳解C語(yǔ)言中strpbrk()函數(shù)的用法

    詳解C語(yǔ)言中strpbrk()函數(shù)的用法

    這篇文章主要介紹了詳解C語(yǔ)言中strpbrk()函數(shù)的用法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • 帶你深度走入C語(yǔ)言取整以及4種函數(shù)

    帶你深度走入C語(yǔ)言取整以及4種函數(shù)

    大家都知道取整這回事,但是對(duì)于取整只有單一的認(rèn)識(shí),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言取整以及4種函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)合式公式的判斷示例

    C語(yǔ)言實(shí)現(xiàn)合式公式的判斷示例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)合式公式的判斷示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評(píng)論

马鞍山市| 攀枝花市| 布尔津县| 宜黄县| 登封市| 克拉玛依市| 玉环县| 离岛区| 辽中县| 巨野县| 苗栗市| 大石桥市| 肇庆市| 吴桥县| 天长市| 阳西县| 康乐县| 墨玉县| 洪洞县| 开江县| 开远市| 措勤县| 阿合奇县| 体育| 吕梁市| 柳州市| 新田县| 梓潼县| 会宁县| 武安市| 临漳县| 桂平市| 睢宁县| 枣强县| 黄梅县| 海丰县| 桐城市| 宣化县| 扶绥县| 泽普县| 黎城县|