本文主要是介绍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管道运算符内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于C++20管道运算符的实现示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!