欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1. transform_iterator 類解析

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

  • 存儲(chǔ)一個(gè)基礎(chǔ)迭代器(_SourceIteratorT)
  • 存儲(chǔ)一個(gè)轉(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:一個(gè)一元函數(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_typepointer、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) {}
  • 通過(guò) 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;
}
  • 移動(dòng)構(gòu)造函數(shù)。

3. 重載運(yùn)算符

3.1 operator*(解引用運(yùn)算符)

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

3.2 operator->(指針訪問(wèn)運(yùn)算符)

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

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

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ī)訪問(wèn)(random access) 時(shí),允許使用 operator[]。

4. make_transform 函數(shù)

該函數(shù)用于創(chuàng)建 transform_iterator 對(duì)象,并根據(jù) _ConversionT 自動(dòng)推導(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 迭代整個(gè)集合。

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

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

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

相關(guān)文章

  • C語(yǔ)言初學(xué)者代碼中的常見(jiàn)錯(cuò)誤與問(wèn)題

    C語(yǔ)言初學(xué)者代碼中的常見(jiàn)錯(cuò)誤與問(wèn)題

    C語(yǔ)言初學(xué)者犯過(guò)的很多錯(cuò)誤都非常典型,在初學(xué)者中非常普遍,于是整理了一下,應(yīng)該對(duì)其他初學(xué)者有借鑒意義
    2013-11-11
  • C++深入分析講解鏈表

    C++深入分析講解鏈表

    當(dāng)我們?cè)趯懸欢未a時(shí),如果要頻繁的在一塊區(qū)域進(jìn)行插入或者刪除操作時(shí),會(huì)發(fā)現(xiàn)用數(shù)組實(shí)現(xiàn)會(huì)比較復(fù)雜,這時(shí)候我們就要用另一種數(shù)據(jù)結(jié)構(gòu),鏈表來(lái)實(shí)現(xiàn)
    2022-06-06
  • C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法

    C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)

    C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)

    這篇文章主要介紹了C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 帶你了解C++初階之引用

    帶你了解C++初階之引用

    這篇文章主要為大家介紹了C++初階之引用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C++?多線程之互斥量(mutex)詳解

    C++?多線程之互斥量(mutex)詳解

    這篇文章主要為大家詳細(xì)介紹了C++多線程之互斥量(mutex),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C語(yǔ)言利用EasyX實(shí)現(xiàn)繪制足球圖案

    C語(yǔ)言利用EasyX實(shí)現(xiàn)繪制足球圖案

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何利用EasyX繪圖庫(kù)實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單的足球圖案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • C++四種cast使用詳細(xì)介紹

    C++四種cast使用詳細(xì)介紹

    本文主要介紹了C++四種cast使用詳細(xì)介紹,今天我們要來(lái)講的是顯式類型轉(zhuǎn)換,C++提供了四種顯式類型轉(zhuǎn)換,分別是:static_cast、dynamic_cast、const_cast、reinterpret_cast,感興趣的可以了解一下
    2022-07-07
  • c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例

    c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例

    這篇文章主要介紹了c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-12-12
  • C++ 創(chuàng)建桌面快捷方式 開始菜單的實(shí)現(xiàn)代碼

    C++ 創(chuàng)建桌面快捷方式 開始菜單的實(shí)現(xiàn)代碼

    這篇文章介紹了C++ 創(chuàng)建桌面快捷方式,開始菜單的實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-06-06

最新評(píng)論