C++20管道运算符的实现示例

2025-06-27 17:50

本文主要是介绍C++20管道运算符的实现示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

我们不打算介绍太多,因为它实际属于c++20最为重要的一个特性ranges的一部分

我们讲解一下使用和自己实现的例子即可

标准库的管道运算符使用

#include <ranges>
#include <IOStream>

int main()
{
    auto const ints = { 0,1,2,3,4,5 };
    auto even = [](int i) { return 0 == i % 2; };
    auto square = [](int i) { return ijs * i; };

    // 组合视图的“管道”语法:
    for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
        std::cout << i << ' ';
    }

    std::cout << '\n';

    // 传统的“函数式”组合语法,filter是筛选,然后再用transform筛选
    for (int i : std::views::transform(std::views::filter(ints, even), square)) {
        std::cChina编程out << i << ' ';
    }
    endl(std::cout);

    auto f = std::views::transform([](int n) { return n *= n; });
    auto ret = ints | f;//并没有改变ints,只是返回一个序列
    for (auto i : ret) {
        std::cout << i << ' ';
    }
}

管道运算符调用的函数并不会改变原来的序列,这一点需要注意。虽然管道运算符相比传统的函数式看着要更加抽象,但是其实如果你真正的去使用了解,倒也是挺优雅的

#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>
#include<algorithm>
#include <numeric>

int main()
{
    using namespace std::literals;
    const auto bits = { "https:"sv, "//"sv, "cppreference"sv, "."sv, "com"sv };
    for (char const c : bits | std::views::join) std::cout << c;
    std::cout << '\n';

    const std::vector<std::vector<int>> v{ {1,2}, {3,4,5}, {6}, {7,8,9} };
    auto jv = std::ranges::joChina编程in_view(v);
    for (auto const  e : jv) std::cout << e << ' ';
    std::cout << '\n';
    
    int array[5][5]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 };
    for (int c : array | std::views::join)std::cout << c<<' ';
    std::cout << '\n';

    //默认只能处理两层,如果多层,那么就多join几次
    int array2[2][2][2]{ 1,2,3,4,5,6China编程,7,8 };
    for (int c : std::ranges::join_view(array2) | std::views::join)std::cout << c << ' ';
    std::cout << '\n';
}

1) 表示由从拉平范围的视图获得的序列组成的 view 。
2) 范围适配器对象。对于任何适合的子表达式 e 表达式 views::join(e) 表达式等价于 join_view<views::all_t<decltype((e))>>{e}

自己实现类似的管道运算符

其实我们只要实现一个operator |即可

template<typename U, typename F>
	requires std::regular_invocable<F, U&>
std::vector<U>& operator | (std::vector<U>& vChina编程l, F f) {
	for (auto& i : vl) {
		f(i);
	}
	return vl;
}

第二行代码是标准库的概念库,要求F是可调用,U的类型也符合

最后返回引用则是为了链式编程

使用如下:

int main() {
	std::vector v{ 1,2,3,4,5 };
	std::function f([](int& i) { i = i * i; });
	std::function f2([](int& i) {i = i + i; });
	std::function f3([](int i) {std::cout << i << ' '; });
	v | f | f2 | f3;
	std::cout << '\n';

	v | [](int& i) { i = i * i; } | [](int i) {std::cout << i << ' '; };

	std::cout << '\n';
	for (auto i : v | [](int& i) {i = i / 10; }) {
		std::cout << i << ' ';
	}
}

C++20管道运算符的实现示例

 多使用即可

到此这篇关于C++20管道运算符的实现示例的文章就介绍到这了,更多相关C++20管道运算符内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于C++20管道运算符的实现示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155240

相关文章

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

MySQL中C接口的实现

《MySQL中C接口的实现》本节内容介绍使用C/C++访问数据库,包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下... 目录准备mysql库使用mysql库编译文件官方API文档对象的创建和关闭链接数据库下达sql指令select语句前言:本节内容介绍使用C/

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常