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 easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决