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
該代碼定義了一個**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[](隨機訪問)
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;隨機訪問(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<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
包裝原始迭代器,并在訪問時應(yīng)用轉(zhuǎn)換函數(shù)_UnaryFuncT
。operator*()
和operator->()
應(yīng)用轉(zhuǎn)換邏輯。make_transform
創(chuàng)建transform_iterator
。make_transform_collection
創(chuàng)建整個集合的transform_iterator
(begin()
和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++字符串拼接效率對比(+=、append、stringstream、sprintf)
這篇文章主要介紹了C++字符串拼接效率對比(+=、append、stringstream、sprintf),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08c++ 結(jié)構(gòu)體內(nèi)存對齊基本概念及示例
這篇文章主要介紹了c++ 結(jié)構(gòu)體內(nèi)存對齊基本概念及示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-12-12C++ 創(chuàng)建桌面快捷方式 開始菜單的實現(xiàn)代碼
這篇文章介紹了C++ 創(chuàng)建桌面快捷方式,開始菜單的實現(xiàn)代碼,需要的朋友可以參考一下2013-06-06