C++变换迭代器使用方法小结

2025-04-07 16:50

本文主要是介绍C++变换迭代器使用方法小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

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::pointuSvJhher 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(_SojsurceIteratorT 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(一元函数)转换为不同类型的值,从而提供了一种在迭代时进行值转换的方式。

1. transform_iterator 类解析

该类继承自 __composition_iterator,是一个泛型迭代器,它的核心功能是:

  • 存储一个基础迭代器(_SourceIteratorT)
  • 存储一个转换函数(_UnaryFuncT)
  • 在 operator*() 及 operator->() 中,应用转换函数

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:一个一元函数(如 lambda、仿函数或函数指针),用于转换值。
  • _SourceIteratorT:源迭代器类型(如 std::vector<int>::iterator)。
  • _SourceValueT:源迭代器的值类型。
  • _ValueT:转换后值的类型。

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:用于提取标准迭代器的 value_typepointerreference 等类型。

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;

这些类型是标准迭代器需要提供的基本类型。

2. transform_iterator 的构造函数

transform_iterator() : __parent_t() {};
  • 默认构造函数,创建空的 transform_iterator
transform_iterator(_SourceIteratorT const& it, _UnaryFuncT f) : func(f), __parent_t(it) {}
  • 通过 it(源迭代器)和 f(转换函数)初始化。
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(transform_iterator&& other) : __parent_t(other.source_it), func(other.func) {
    this->source_it = other.source_it;
}
  • 移动构造函数。

3. 重载运算符

3.1 operator*(解引用运算符)

inline reference operator*() const { return func(*this->source_it); }
  • 通过 func 对 source_it 指向的值进行转换,并返回结果。

3.2 operator->(指针访问运算符)

inline pointer operator->() const { return &func(*this->source_it); }
  • 计算转换后的值,并返回指针。

3.3 operator[](随机访问)

template<typename ReferenceT = reference>
inline std::enable_if_t<std::is_same_v<ReferenceT, rjseference> &&
    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]);
}
  • 仅当迭代器支持 随机访问(random access) 时,允许使用 operator[]

4. make_transform 函数

该函数用于创建 transform_iterator 对象,并根据 _ConversionT 自动推导类型。

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:转换逻辑,必须是引用转换(reference_conversion_tag)。
  • _SourceIteratorT:源容器的迭代器类型。
  • typename _SourceIteratorT::value_type:源数据类型。
  • typename _ConversionT::value_type:转换后数据类型。

5. make_transform_collection

该函数用于 创建 transform_iterator 迭代整个集合。

5.1 非常规版本

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::vauSvJhhlue_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())
    };
}
  • 创建 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 容器。

总结

  • transform_iterator 包装原始迭代器,并在访问时应用转换函数 _UnaryFuncT
  • operator*() 和 operator->() 应用转换逻辑。
  • make_transform 创建 transform_iterator
  • make_transform_collection 创建整个集合的 transform_iteratorbegin() 和 end())。

这种模式适用于 懒加载转换,避免显式创建新数据结构,提高效率。

到此这篇关于C++变换迭代器使用方法小结的文章就介绍到这了,更多相关C++变换迭代器使用内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于C++变换迭代器使用方法小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:http://www.cppcns.com/ruanjian/c/706760.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1154112

相关文章

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件