C++變換迭代器使用方法小結(jié)
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_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) {}
- 通過(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<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()) }; }
- 創(chuàng)建 begin 和 end 的 transform_iterator。
5.2 const 版本
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) { 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_iterator
(begin()
和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é)者犯過(guò)的很多錯(cuò)誤都非常典型,在初學(xué)者中非常普遍,于是整理了一下,應(yīng)該對(duì)其他初學(xué)者有借鑒意義2013-11-11C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法
今天小編就為大家分享一篇關(guān)于C語(yǔ)言項(xiàng)目全正整數(shù)后再計(jì)算的三種參考解答方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)
這篇文章主要介紹了C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C語(yǔ)言利用EasyX實(shí)現(xiàn)繪制足球圖案
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何利用EasyX繪圖庫(kù)實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單的足球圖案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-11-11c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例
這篇文章主要介紹了c++ 結(jié)構(gòu)體內(nèi)存對(duì)齊基本概念及示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-12-12C++ 創(chuàng)建桌面快捷方式 開始菜單的實(shí)現(xiàn)代碼
這篇文章介紹了C++ 創(chuàng)建桌面快捷方式,開始菜單的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-06-06