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.chinasem.cn/article/1154112

相关文章

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法