C++里面也能用管道了!
Posted 花花酱LeetCode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++里面也能用管道了!相关的知识,希望对你有一定的参考价值。
相信使用过Linux或者macOS的命令行的小伙伴一定对管道不陌生。管道操作符"|",用来连接两个命令,把前面一个命令的输出作为后面一个命令的输入。花花最常用的就是cat接grep,在文本文件中查找特定的字符串。比如下面的例子,我们就可以在hamlet.txt中查Gentleman这个单词,把它出现的行及行号打印出来。
➜ cat hamlet.txt | grep -n Gentleman
21: A Gentleman, courtier.
3140:Enter Horatio, Queen, and a Gentleman.
3159: [Exit Gentleman.]
如果你之前没有使用过命令行也没关,后台回复"命令行",花花有一系列的视频教程。
扯远了,让我们回到C++上来。在过去的2020年中,还有一件重要的事情没有向大家宣布,那就是C++20正式发布了!C++20增加了大量的新功能,步子之大可以和从C++98到C++11的升级一决高下。有同学可能会说:"什么?C++11我还没完全学会呢?别说C++14/17了,如今C++20又来了,还让不让人活啊!" 更多的新功能和特性同时意味着更高的学习成本,不过花花和你一样,也要从零开始学习C++20。今天我们就来一起学习一下C++20的其中一个新特性:Ranges。
花花先给大家出道题:在控制台输出前1000个素数,你可以假设已经给了你一个isPrime函数来判断一个数是不是素数。
如果使用C/C++或者Java的话,我相信大部分的同学的代码长得应该是这个样子:
int count = 0;
for (int x = 1; x < 1000000; ++x) {
if (isPrime(x)) {
cout << x << endl;
++count;
if (count == 1000) break;
}
}
非常经典的过程式编程,类似的代码大家应该都写过无数遍了。
Ranges的引入使得在C++使用函数式编程变得更加方便和优雅,我们来看一下如果使用函数式编程去实现同一个功能代码会变成什么样子:
for (int prime : take(filter(iota_view(1),isPrime),1000))
cout << prime << endl;
iota_view函数生成一个从1开始的无限序列,类似于python中的range,filter函数处理这个序列,对每个元素调用isPrime函数,只保留返回值为true的元素,最后take函数从这个序列中提取前1000个元素,然后结束整个计算过程。值得一提的是这些函数都是惰性求值的(Lazy Evaluation),即没有任何不必要的计算。iota_view会在找到第1000个素数7919后停止,而不会循环到无穷大。如果不是惰性求值,一开始就需要在内存中创建出一个无限的序列[1, INT_MAX],然后找到所有的素数,最后再从中取出前1000个,这样子的话后面的计算完全就浪费掉了。
使用函数式变成虽然把代码缩短到了一行,但是相信同学们应该发现了函数式编程的一些问题:过多的函数嵌套,会出现大量的括号(用过lisp的同学举个手 以上是关于C++里面也能用管道了!的主要内容,如果未能解决你的问题,请参考以下文章 [Go] 通过 17 个简短代码片段,切底弄懂 channel 基础