gcd 算法是基于欧几里德算法确定最大条约数(greatest common divisor)。我运用了这个缩写函数模板句法来定义 gcd。gcd 要求其参数和前往类型支持概念 Integral。gcd 是一类对参数和前往值都有要求的函数模板。当我删除这个句法糖(syntactic sugar)时,也许你能看到 gcd 的真正本质。
下面这段代码在语义上与 gcd 算法等效:
template<typename T>
requires Integral<T>()
T gcd(T a, T b){
if( b == 0 ) return a;
else return gcd(b, a % b);
}
假设你还没看到 gcd 的真正本质,过几周我还会专门发布一篇引见概念的文章。
范围库(Ranges Library)
范围库是概念的首个客户。它支持的算法满足以下条件:
可以直接在容器上操作;无需迭代器指定一个范围;
可以宽松地评价;
可以组合。
复杂来说:范围库支持函数形式(functional patterns)。
代码能够比言语描画更清楚。下面的函数用竖线符号展现了函数组成:
#include <vector>
#include <ranges>
#include <iostream>
int main(){
std::vector<int> 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::view::filter(even) |
std::view::transform(square)) {
std::cout << i << ' '; // 0 4 16
}
}
even 是一个 lambda 函数,其在 i 为偶数时前往;lambda 函数 square 则会将 i 映射为它的平方。其他的必须从左到右读取的第 i 个函数组成:for (int i : ints | std::view::filter(even) | std::view::transform(square)). 将过滤器 even 运用于 ints 的每个元素,然后将其他的每个元素映射为它们的平方。假设你熟习函数编程,那么这读起来就像一篇散文诗。
协程(Coroutines)
协程是狭义的函数,能在保持形状的同时暂停或继续。协程通常用来编写事情驱动型运用。事情驱动型运用可以是模拟、游戏、效劳器、用户接口或算法。协程也通常被用于协作式多义务(cooperative multitasking)。
我们这里不引见 C++20 的详细协程,而会引见编写协程的框架。编写协程的框架由 20 多个函数构成,其中一部分需求你去完成,另一部分则能够需求重写。因此,你可以依据需求调整协程。
下面展现了一个特定协程的用法。下面的顺序运用了一个能产生有限数据流的生成器:
Generator<int> getNext(int start = 0, int step = 1){
auto value = start;
for (int i = 0;; ++i){
co_yield value; // 1
value += step;
}
}
int main() {
std::cout << std::endl;
std::cout << "getNext():";
auto gen = getNext();
(责任编辑:admin)