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

淺談C++反向迭代器的設計

 更新時間:2023年04月27日 11:12:33   作者:看到我請叫我滾去學習Orz  
本文主要介紹了淺談C++反向迭代器的設計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

STL中不少的容器需要有迭代器這樣的設計,特別是正向迭代器,幾乎每個容器都有自己的特定實現(xiàn)方式,有了正向迭代器之后,我們還要提供反向迭代器以供一些特殊的需求,但是許多容器的正向迭代器實現(xiàn)的方式不一樣,如果我們要實現(xiàn)其反向迭代器,每個容器的反向迭代器的實現(xiàn)方式也不一樣,有沒有一種方法能夠統(tǒng)一反向迭代器的實現(xiàn)方式呢?

有的,那就是拿已有的正向迭代器進行封裝,這樣只要我們實現(xiàn)了正向迭代器,反向迭代器自然而然就形成了,本篇文章我們就來一起探究這種設計方式。

一、反向迭代器的結構

我們設計的反向迭代器是用正向迭代器實現(xiàn)的,這樣反向迭代器的實現(xiàn)方式就統(tǒng)一了,那么我們反向迭代器的成員變量就是一個正向迭代器,關于成員函數,我們反向迭代器提供的接口與正向迭代器提供的接口一樣。

//第一個模板參數傳遞 正向迭代器,第二個傳遞 迭代器的引用 第三個傳遞 迭代器的地址
?template<class Iterator, class Ref, class Ptr>
?//用struct定義類,因為我們想要公開我們的接口
?struct _reverse_iterator
?{
??? ?//對自己進行typedef方便使用
??? ?typedef _reverse_iterator<Iterator, Ref, Ptr> self;
? ? //成員變量 是一個正向迭代器
? ? Iterator _current;
? ? //構造函數 ? 用一個正向迭代器進行初始化反向迭代器對象
? ? _reverse_iterator(Iterator it)
? ? ? ? :_current(it)
? ? {}
? ? //*運算符重載
? ? Ref operator*();
? ? //前置++運算符重載
? ? self& operator++();
? ? //后置++運算符重載
? ? self operator++(int)
? ? //前置--運算符重載
? ? self& operator--()
? ? //后置--運算符
? ? self operator--(int)
? ? //->操作符
? ? Ptr operator->()
? ? //關系運算符
? ? bool operator!=(const self& s);
? ? bool operator==(const self& s);
?}

容器類內的rbegin與rend 函數

//類內使用反向迭代器
class myclass
{
? ? ?//此類內要配套有一個正向迭代器iterator,然后傳給外面的反向迭代器
? ? ?//將反向迭代器進行typedef方便使用
? ? ?typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;
? ? ? //反向迭代器
? ? ?typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;
? ? ?//反向迭代器
? ? ?reverse_iterator rbegin()
? ? ?{
? ? ?? ?return reverse_iterator(end());
? ? ?}
? ? ?reverse_iterator rend()
? ? ?{
? ? ??? ?return reverse_iterator(begin());
? ? ?}
? ? ?//const反向迭代器
? ? ?const_reverse_iterator rbegin() const
? ? ?{
? ? ??? ?return const_reverse_iterator(end());
? ? ?}
? ? ?const_reverse_iterator rend() const
? ? ?{
? ? ?? ?return const_reverse_iterator(begin());
? ? ?}
};

注意: 反向迭代器這里我們采用了對稱結構便于理解對比,但這也導致我們后面在進行*解引用操作符時要解引用前一個位置!

二、反向迭代器的接口實現(xiàn)

1、*運算符重載

我們可以創(chuàng)建一個局部對象,對局部對象進行--找到前一個位置,然后再進行解引用返回就行了。

//*運算符重載
Ref operator*()
{
    //這里是不用寫拷貝構造的,默認的拷貝構造會對內置類型進行值拷貝,對自定義類型調用它的拷貝構造
    Iterator tmp = _current;
    --tmp;
    return *tmp;
}

2、算術運算符 ++ - -的重載

由于我們的反向迭代器是由正向迭代器實現(xiàn)的,反向迭代器++就相當于正向迭代器- - ,明白了這個就很好實現(xiàn)算術運算符重載了。

//前置++運算符重載
self& operator++()
{
    --_current;
    return(*this);
}
//后置++運算符重載
self operator++(int)
{
    //保存當前對象
    self tmp(*this);
    --_current;
    //返回--之前的對象
    return tmp;
}
//前置--運算符重載
self& operator--()
{
    ++_current;
    return (*this);
}
//后置--運算符
self operator--(int)
{
    self tmp(*this);
    ++_current;
    return tmp;
}

3、->操作符重載

->運算符重載我們只需要返回容器中存儲的自定義類型的對象的地址就行了,我們可以先調用operator*()拿到容器中存儲的對象,然后再進行取地址&

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

4、關系運算符

要判斷兩個反向迭代器相不相等,只需要判斷反向迭代器里面的成員變量相不相等就行了。

//關系運算符
bool operator!=(const self& s)
{
    return _current != s._current;
}
bool operator==(const self& s)
{
    return _current == s._current;
}

到這里我們的反向迭代器就已經形成了。

三、關于反向迭代器的一些討論

由于我們的反向迭代器是用模板寫的,當我們將vector的迭代器類型傳遞過去時,我們的反向迭代器就變成了vector的反向迭代器,當我們將list的迭代器傳遞過去時,就形成了list的反向迭代器。

傳遞的迭代器必須的二元迭代器,可以++ ,- -。forward_list的迭代器就不行!

例如:實現(xiàn)vector的反向迭代器,我們只需要在類內部傳遞一下正向迭代器,然后typedef一下就行了。

template<class T>
class vector
{
public:
?? ?//正向迭代器
?? ?typedef ?T* iterator;
?? ?//反向迭代器 ? 將正向迭代器進行傳遞給反向迭代器
?? ?typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;
?? ?typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;
?? ?//普通迭代器 ?------------------------------------------------
?? ?iterator begin();
?? ?iterator end();
?? ?//const迭代器
?? ?typedef const T* const_iterator;
?? ?const_iterator begin() const;
?? ?const_iterator end() const;
?? ?//反向迭代器
?? ?reverse_iterator rbegin()
?? ?{
?? ??? ?return reverse_iterator(end());
?? ?}
?? ?reverse_iterator rend()
?? ?{
?? ??? ?return reverse_iterator(begin());
?? ?}
?? ?//const反向迭代器
?? ?const_reverse_iterator rbegin() const
?? ?{
?? ??? ?return const_reverse_iterator(end());
?? ?}
?? ?const_reverse_iterator rend() const
?? ?{
?? ??? ?return const_reverse_iterator(begin());
?? ?}
?? ?......?
?? ?......?
?? ?......?
};

到此這篇關于淺談C++反向迭代器的設計的文章就介紹到這了,更多相關C++反向迭代器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • VisualStudio2022編寫C語言的實現(xiàn)步驟

    VisualStudio2022編寫C語言的實現(xiàn)步驟

    VisualStudio2022是一款強大的集成開發(fā)環(huán)境,可以用來編寫C語言程序,本文主要介紹了VisualStudio2022編寫C語言的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • C語言?如何用堆解決Topk問題

    C語言?如何用堆解決Topk問題

    TopK問題即在N個數中找出最大的前K個,這篇文章將詳細講解如何利用小根堆的方法解決TopK問題,文中代碼具有一定參考價值,快跟隨小編一起學習一下吧
    2021-12-12
  • 詳解VS2019使用scanf()函數報錯的解決方法

    詳解VS2019使用scanf()函數報錯的解決方法

    本文主要介紹了詳解VS2019使用scanf()函數報錯的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言 文件的打開與關閉詳解及示例代碼

    C語言 文件的打開與關閉詳解及示例代碼

    本文主要介紹C語言 文件的基礎知識,這里整理了相關資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • C++中關于constexpr函數使用及說明

    C++中關于constexpr函數使用及說明

    這篇文章主要介紹了C++中關于constexpr函數使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++可變參數的實現(xiàn)方法

    C++可變參數的實現(xiàn)方法

    可變參數給編程帶來了很大的方便,在享受它帶來的方便的同時,很有必要了解一下其實現(xiàn)方式,在了解編程語言的同時,也可以擴展編程的思路。
    2013-03-03
  • C++?Qt開發(fā)之關聯(lián)容器類使用方法詳解

    C++?Qt開發(fā)之關聯(lián)容器類使用方法詳解

    當我們談論編程中的數據結構時,順序容器是不可忽視的一個重要概念,Qt?中提供了豐富的容器類,用于方便地管理和操作數據,本章我們將主要學習關聯(lián)容器,主要包括?QMap?,QSet和?QHash,感興趣的朋友跟著小編一起來學習吧
    2023-12-12
  • 10行C++代碼實現(xiàn)高性能HTTP服務

    10行C++代碼實現(xiàn)高性能HTTP服務

    這篇文章主要介紹了10行C++代碼如何實現(xiàn)高性能HTTP服務,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下
    2021-04-04
  • C++中靜態(tài)成員函數與靜態(tài)成員變量(static )

    C++中靜態(tài)成員函數與靜態(tài)成員變量(static )

    這篇文章主要介紹了C++中靜態(tài)成員函數與靜態(tài)成員變量(static )的相關資料,需要的朋友可以參考下
    2017-06-06
  • OpenCV實現(xiàn)平均背景法

    OpenCV實現(xiàn)平均背景法

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)平均背景法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

湄潭县| 滁州市| 克东县| 西藏| 都安| 灵山县| 南华县| 大新县| 奈曼旗| 边坝县| 临西县| 绥中县| 尉犁县| 麻江县| 灯塔市| 桂平市| 邵阳县| 盐城市| 革吉县| 福清市| 花垣县| 冀州市| 潢川县| 塘沽区| 浙江省| 荥阳市| 兰考县| 彭山县| 大化| 北安市| 高青县| 巧家县| 敦化市| 宜兴市| 平塘县| 鲜城| 宜州市| 达拉特旗| 湘乡市| 龙山县| 仙桃市|