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

C++變換迭代器使用方法小結(jié)

 更新時間:2025年04月07日 11:11:28   作者:點云SLAM  
本文主要介紹了C++變換迭代器使用方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、源碼

template<class _UnaryFuncT, class _SourceIteratorT, class _SourceValueT, class _ValueT>
        class transform_iterator :
            public __composition_iterator<transform_iterator<_UnaryFuncT, _SourceIteratorT, _SourceValueT, _ValueT>,
            _SourceIteratorT, _SourceValueT> {
        public:
            using __parent_t = __composition_iterator<transform_iterator<_UnaryFuncT, _SourceIteratorT, _SourceValueT, _ValueT>,
                _SourceIteratorT, _SourceValueT>;
            typedef convert_pointer_t<_SourceIteratorT, _ValueT> __pointer_t;
            typedef std::iterator_traits<__pointer_t> __std_iterator_traits;
            _UnaryFuncT func;
            typedef typename _SourceIteratorT::iterator_category iterator_category;
            typedef typename _SourceIteratorT::difference_type difference_type;
            typedef typename __std_iterator_traits::value_type value_type;
            typedef typename __std_iterator_traits::pointer pointer;
            typedef typename __std_iterator_traits::reference reference;

            transform_iterator() : __parent_t() {};

            transform_iterator(_SourceIteratorT const& it, _UnaryFuncT f) : func(f), __parent_t(it) {}

            explicit transform_iterator(_SourceIteratorT const& it) : __parent_t(it) {};

            transform_iterator(const transform_iterator& other) : __parent_t(other.source_it), func(other.func) {}

            transform_iterator& operator=(const transform_iterator& other) {
                this->source_it = other.source_it;
                this->func = other.func;
                return *this;
            }

            transform_iterator(transform_iterator&& other) : __parent_t(other.source_it), func(other.func) {
                this->source_it = other.source_it;
            }

            transform_iterator& operator=(transform_iterator&& other) {
                this->source_it = other.source_it;
                this->func = other.func;
                return *this;
            }

            inline reference operator*() const { return func(*this->source_it); }

            inline pointer operator->() const { return &func(*this->source_it); }

            template<typename ReferenceT = reference>
            inline std::enable_if_t<std::is_same_v<ReferenceT, reference>&&
                std::is_same_v<iterator_category, std::random_access_iterator_tag>, ReferenceT>
                operator[](difference_type __n) const {
                static_assert(std::is_same_v<iterator_category, std::random_access_iterator_tag>);
                return func(this->source_it[__n]);
            }

            inline const pointer base() const { return &func(*(this->source_it)); }

        };


        /*!
         * @brief   Convenient method to make a transform_iterator with template deduction, for a given Conversion
         */
        template<typename _ConversionT, typename _SourceIteratorT>
        slam::transform_iterator<_ConversionT,
            _SourceIteratorT,
            typename _SourceIteratorT::value_type,
            typename _ConversionT::value_type> make_transform(_SourceIteratorT it,
                _ConversionT) {
            static_assert(std::is_same_v<typename _ConversionT::conversion_category, reference_conversion_tag>,
                "A transform iterator can only be applied with a conversion mapping two references");
            return slam::transform_iterator<_ConversionT, _SourceIteratorT,
                typename _SourceIteratorT::value_type, typename _ConversionT::value_type>(it);
        };

        /**
         * @brief Returns the pair <begin, end> transform iterators of a collection, for a given Conversion
         */
        template<typename _ConversionT, typename _SourceCollection>
        std::pair<slam::transform_iterator<_ConversionT,
            typename _SourceCollection::iterator,
            typename _SourceCollection::iterator::value_type,
            typename _ConversionT::value_type>,
            slam::transform_iterator<_ConversionT,
            typename _SourceCollection::iterator,
            typename _SourceCollection::iterator::value_type,
            typename _ConversionT::value_type>> make_transform_collection(_SourceCollection& collection,
                _ConversionT) {
            static_assert(std::is_same_v<typename _ConversionT::conversion_category, reference_conversion_tag>,
                "A transform iterator can only be applied with a conversion mapping two references");
            return {
                    make_transform(collection.begin(), _ConversionT()),
                    make_transform(collection.end(), _ConversionT())
            };
        }

        /**
         * @brief Returns the pair <begin, end> transform iterators of a collection, for a given Conversion
         */
        template<typename _ConversionT, typename _SourceCollection>
        std::pair<slam::transform_iterator<_ConversionT,
            typename _SourceCollection::const_iterator,
            typename _SourceCollection::const_iterator::value_type,
            typename _ConversionT::value_type>,
            slam::transform_iterator<_ConversionT,
            typename _SourceCollection::const_iterator,
            typename _SourceCollection::const_iterator::value_type,
            typename _ConversionT::value_type>> make_transform_collection(const _SourceCollection& collection,
                _ConversionT) {
            static_assert(std::is_same_v<typename _ConversionT::conversion_category, reference_conversion_tag>,
                "A transform iterator can only be applied with a conversion mapping two references");
            return {
                    make_transform(collection.begin(), _ConversionT()),
                    make_transform(collection.end(), _ConversionT())
            };
        }

2、代碼解析

代碼解析:transform_iterator

該代碼定義了一個**transform_iterator(變換迭代器)**,它將一個迭代器的值通過 UnaryFunction(一元函數(shù))轉(zhuǎn)換為不同類型的值,從而提供了一種在迭代時進(jìn)行值轉(zhuǎn)換的方式。

1. transform_iterator 類解析

該類繼承自 __composition_iterator,是一個泛型迭代器,它的核心功能是:

  • 存儲一個基礎(chǔ)迭代器(_SourceIteratorT)
  • 存儲一個轉(zhuǎn)換函數(shù)(_UnaryFuncT)
  • 在 operator*() 及 operator->() 中,應(yīng)用轉(zhuǎn)換函數(shù)

1.1 transform_iterator 的主要成員

template<class _UnaryFuncT, class _SourceIteratorT, class _SourceValueT, class _ValueT>
class transform_iterator :
    public __composition_iterator<transform_iterator<_UnaryFuncT, _SourceIteratorT, _SourceValueT, _ValueT>,
    _SourceIteratorT, _SourceValueT> {
  • _UnaryFuncT:一個一元函數(shù)(如 lambda、仿函數(shù)或函數(shù)指針),用于轉(zhuǎn)換值。
  • _SourceIteratorT:源迭代器類型(如 std::vector<int>::iterator)。
  • _SourceValueT:源迭代器的值類型。
  • _ValueT:轉(zhuǎn)換后值的類型。

1.2 主要類型定義

using __parent_t = __composition_iterator<transform_iterator<_UnaryFuncT, _SourceIteratorT, _SourceValueT, _ValueT>, 
                _SourceIteratorT, _SourceValueT>;

typedef convert_pointer_t<_SourceIteratorT, _ValueT> __pointer_t;
typedef std::iterator_traits<__pointer_t> __std_iterator_traits;
  • __parent_t:繼承自 __composition_iterator,封裝了基本的迭代器功能。
  • __pointer_t:用于獲取指向 _ValueT 的指針類型。
  • __std_iterator_traits:用于提取標(biāo)準(zhǔn)迭代器的 value_type、pointer、reference 等類型。

1.3 迭代器所需的類型

typedef typename _SourceIteratorT::iterator_category iterator_category;
typedef typename _SourceIteratorT::difference_type difference_type;
typedef typename __std_iterator_traits::value_type value_type;
typedef typename __std_iterator_traits::pointer pointer;
typedef typename __std_iterator_traits::reference reference;

這些類型是標(biāo)準(zhǔn)迭代器需要提供的基本類型。

2. transform_iterator 的構(gòu)造函數(shù)

transform_iterator() : __parent_t() {};
  • 默認(rèn)構(gòu)造函數(shù),創(chuàng)建空的 transform_iterator。
transform_iterator(_SourceIteratorT const& it, _UnaryFuncT f) : func(f), __parent_t(it) {}
  • 通過 it(源迭代器)和 f(轉(zhuǎn)換函數(shù))初始化。
explicit transform_iterator(_SourceIteratorT const& it) : __parent_t(it) {};
  • 僅使用源迭代器初始化,轉(zhuǎn)換函數(shù)未提供。
transform_iterator(const transform_iterator& other) : __parent_t(other.source_it), func(other.func) {}
  • 復(fù)制構(gòu)造函數(shù)。
transform_iterator(transform_iterator&& other) : __parent_t(other.source_it), func(other.func) {
    this->source_it = other.source_it;
}
  • 移動構(gòu)造函數(shù)。

3. 重載運算符

3.1 operator*(解引用運算符)

inline reference operator*() const { return func(*this->source_it); }
  • 通過 func 對 source_it 指向的值進(jìn)行轉(zhuǎn)換,并返回結(jié)果。

3.2 operator->(指針訪問運算符)

inline pointer operator->() const { return &func(*this->source_it); }
  • 計算轉(zhuǎn)換后的值,并返回指針。

3.3 operator[](隨機(jī)訪問)

template<typename ReferenceT = reference>
inline std::enable_if_t<std::is_same_v<ReferenceT, reference> &&
    std::is_same_v<iterator_category, std::random_access_iterator_tag>, ReferenceT>
    operator[](difference_type __n) const {
    static_assert(std::is_same_v<iterator_category, std::random_access_iterator_tag>);
    return func(this->source_it[__n]);
}
  • 僅當(dāng)?shù)髦С?nbsp;隨機(jī)訪問(random access) 時,允許使用 operator[]

4. make_transform 函數(shù)

該函數(shù)用于創(chuàng)建 transform_iterator 對象,并根據(jù) _ConversionT 自動推導(dǎo)類型。

template<typename _ConversionT, typename _SourceIteratorT>
slam::transform_iterator<_ConversionT, _SourceIteratorT, 
    typename _SourceIteratorT::value_type, typename _ConversionT::value_type>
    make_transform(_SourceIteratorT it, _ConversionT) {
    static_assert(std::is_same_v<typename _ConversionT::conversion_category, reference_conversion_tag>,
        "A transform iterator can only be applied with a conversion mapping two references");
    return slam::transform_iterator<_ConversionT, _SourceIteratorT, 
        typename _SourceIteratorT::value_type, typename _ConversionT::value_type>(it);
}
  • _ConversionT:轉(zhuǎn)換邏輯,必須是引用轉(zhuǎn)換(reference_conversion_tag)。
  • _SourceIteratorT:源容器的迭代器類型。
  • typename _SourceIteratorT::value_type:源數(shù)據(jù)類型。
  • typename _ConversionT::value_type:轉(zhuǎn)換后數(shù)據(jù)類型。

5. make_transform_collection

該函數(shù)用于 創(chuàng)建 transform_iterator 迭代整個集合。

5.1 非常規(guī)版本

template&lt;typename _ConversionT, typename _SourceCollection&gt;
std::pair&lt;slam::transform_iterator&lt;_ConversionT,
    typename _SourceCollection::iterator,
    typename _SourceCollection::iterator::value_type,
    typename _ConversionT::value_type&gt;,
    slam::transform_iterator&lt;_ConversionT,
    typename _SourceCollection::iterator,
    typename _SourceCollection::iterator::value_type,
    typename _ConversionT::value_type&gt;&gt; 
    make_transform_collection(_SourceCollection&amp; collection, _ConversionT) {
    static_assert(std::is_same_v&lt;typename _ConversionT::conversion_category, reference_conversion_tag&gt;,
        "A transform iterator can only be applied with a conversion mapping two references");
    return {
        make_transform(collection.begin(), _ConversionT()),
        make_transform(collection.end(), _ConversionT())
    };
}
  • 創(chuàng)建 begin 和 end 的 transform_iterator。

5.2 const 版本

template&lt;typename _ConversionT, typename _SourceCollection&gt;
std::pair&lt;slam::transform_iterator&lt;_ConversionT,
    typename _SourceCollection::const_iterator,
    typename _SourceCollection::const_iterator::value_type,
    typename _ConversionT::value_type&gt;,
    slam::transform_iterator&lt;_ConversionT,
    typename _SourceCollection::const_iterator,
    typename _SourceCollection::const_iterator::value_type,
    typename _ConversionT::value_type&gt;&gt; 
    make_transform_collection(const _SourceCollection&amp; collection, _ConversionT) {
    return {
        make_transform(collection.begin(), _ConversionT()),
        make_transform(collection.end(), _ConversionT())
    };
}
  • 適用于 const 容器。

總結(jié)

  • transform_iterator 包裝原始迭代器,并在訪問時應(yīng)用轉(zhuǎn)換函數(shù) _UnaryFuncT。
  • operator*() 和 operator->() 應(yīng)用轉(zhuǎn)換邏輯。
  • make_transform 創(chuàng)建 transform_iterator。
  • make_transform_collection 創(chuàng)建整個集合的 transform_iteratorbegin() 和 end())。

這種模式適用于 懶加載轉(zhuǎn)換,避免顯式創(chuàng)建新數(shù)據(jù)結(jié)構(gòu),提高效率。

到此這篇關(guān)于C++變換迭代器使用方法小結(jié)的文章就介紹到這了,更多相關(guān)C++變換迭代器使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++編程中的或||、與&&、非!邏輯運算符基本用法整理

    C++編程中的或||、與&&、非!邏輯運算符基本用法整理

    這篇文章主要介紹了C++中的或||、與&&、非!邏輯運算符基本用法整理,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • 基于C語言實現(xiàn)的掃雷游戲代碼

    基于C語言實現(xiàn)的掃雷游戲代碼

    這篇文章主要介紹了基于C語言實現(xiàn)的掃雷游戲代碼,對于學(xué)習(xí)游戲開發(fā)的朋友有一定的借鑒價值,需要的朋友可以參考下
    2014-08-08
  • C++17 中的 std::launder定義和用法詳解

    C++17 中的 std::launder定義和用法詳解

    std::launder是C++17標(biāo)準(zhǔn)引入的一個模板函數(shù),用于在對象表示發(fā)生變化時通知編譯器,從而避免未定義行為,它主要用于處理placement new、虛函數(shù)表更新和類似std::optional的場景,本文介紹 C++17 中的 std::launder定義和用法,感興趣的朋友一起看看吧
    2025-02-02
  • 用c++寫控制臺貪吃蛇游戲完整步驟

    用c++寫控制臺貪吃蛇游戲完整步驟

    用C++制作貪吃蛇游戲是一個經(jīng)典的編程練習(xí),它涉及多個方面的編程知識,包括數(shù)據(jù)結(jié)構(gòu)、圖形界面、事件處理等,這篇文章主要介紹了用c++寫控制臺貪吃蛇游戲的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-12-12
  • C語言快速掌握位段使用

    C語言快速掌握位段使用

    位段位段的聲明和結(jié)構(gòu)是類似的,但是也會有所不同,此篇文章將帶你了解位段是什么已以及位段的使用和位段的特性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • C++獲取本機(jī)MAC,IP,MASK地址的方法

    C++獲取本機(jī)MAC,IP,MASK地址的方法

    這篇文章主要介紹了C++獲取本機(jī)MAC,IP,MASK地址的方法,主要通過IPHLPAPI.lib調(diào)用相關(guān)函數(shù)實現(xiàn)該功能,是非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • C語言內(nèi)嵌匯編API內(nèi)存搜索引擎實例

    C語言內(nèi)嵌匯編API內(nèi)存搜索引擎實例

    這篇文章主要介紹了C語言內(nèi)嵌匯編API內(nèi)存搜索引擎實例,涉及匯編語言與內(nèi)存相關(guān)操作,需要的朋友可以參考下
    2014-10-10
  • C語言堆結(jié)構(gòu)處理TopK問題詳解

    C語言堆結(jié)構(gòu)處理TopK問題詳解

    TopK問題即在N個數(shù)中找出最大的前K個,這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問題,文中代碼具有一定參考價值,快跟隨小編一起學(xué)習(xí)一下吧
    2022-06-06
  • 詳解C++中普通舊數(shù)據(jù)(POD)的使用

    詳解C++中普通舊數(shù)據(jù)(POD)的使用

    普通舊數(shù)據(jù)就是內(nèi)存中的連續(xù)字節(jié)序列,是能夠被“僅當(dāng)作數(shù)據(jù)”處理的對象。這篇文章主要帶大家了解一下C++中普通舊數(shù)據(jù)的定義與使用,感興趣的可以了解下
    2023-03-03
  • C++連接mysql數(shù)據(jù)庫(改進(jìn)版)

    C++連接mysql數(shù)據(jù)庫(改進(jìn)版)

    C++是大家都非常熟悉的,也是大家平時辦公中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評論

亳州市| 武宁县| 梧州市| 祁东县| 泰州市| 八宿县| 邮箱| 郯城县| 中西区| 广州市| 汽车| 莱阳市| 莱西市| 修水县| 东阳市| 施秉县| 余庆县| 西林县| 英山县| 庆元县| 衡水市| 环江| 万全县| 玛曲县| 基隆市| 呼图壁县| 获嘉县| 咸丰县| 公主岭市| 来凤县| 吉木萨尔县| 松溪县| 山东省| 大兴区| 青海省| 长泰县| 班戈县| 于都县| 鸡泽县| 汝南县| 长海县|