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

 更新时间:2025年06月27日 11:53:32   作者:mq白  
本文简要介绍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 i * 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::cout << 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::join_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,6,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>& vl, 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++特殊类设计与类型转换详细代码示例

    C++特殊类设计与类型转换详细代码示例

    在C++编程语言中,类类型转换操作符是一种特殊的功能,允许我们把一个类的对象转换为其他类型,如内置类型、类类型或者由类型别名定义的类型,这篇文章主要介绍了C++特殊类设计与类型转换的相关资料,需要的朋友可以参考下
    2026-01-01
  • Qt实现简单五子棋小游戏

    Qt实现简单五子棋小游戏

    这篇文章主要为大家详细介绍了Qt实现简单五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C语言 if else 语句详细讲解

    C语言 if else 语句详细讲解

    本文主要介绍C语言中的if else,这里详细介绍了if else 语句并提供了简单的示例代码,希望能帮助编程入门的小伙伴学习
    2016-07-07
  • Qt读写ini文件之QSettings用法

    Qt读写ini文件之QSettings用法

    这篇文章主要为大家介绍了Qt读写ini文件之QSettings的使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Qt实现进程间通信

    Qt实现进程间通信

    这篇文章主要为大家详细介绍了Qt实现进程间通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C/C++中的OpenCV读取视频与调用摄像头

    C/C++中的OpenCV读取视频与调用摄像头

    这篇文章主要介绍了C/C++中的OpenCV读取视频与调用摄像头,具有很好的参考价值,希望对大家有所帮助。
    2022-11-11
  • C++数据结构二叉搜索树的实现应用与分析

    C++数据结构二叉搜索树的实现应用与分析

    从这篇博客开始,我就要和大家介绍有关二叉搜索树的知识,它还衍生出了两棵树——AVL树和红黑树,在后面两篇博客我都会介绍。今天先从二叉搜索树开始引入
    2022-02-02
  • C++实现日期类(Date)

    C++实现日期类(Date)

    这篇文章主要为大家详细介绍了C++实现日期类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C语言sizeof和strlen区别小结

    C语言sizeof和strlen区别小结

    C语言中的sizeof和strlen是两个常用的操作符/函数,但它们的功能和用途有很大的区别,本文就详细的来介绍一下C语言sizeof和strlen区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C语言使用scanf连续输入字符串出现的问题

    C语言使用scanf连续输入字符串出现的问题

    这篇文章主要介绍了C语言使用scanf连续输入字符串出现的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论