Re: 关于 stl 和 c++ 的一点问题

楼主: poyenc (发箍)   2018-11-30 01:31:54
哈囉, 如果你对 STL 有兴趣的话可以参考下面的影片 (依序看):
CppCon 2018: Jonathan Boccara “105 STL Algorithms in Less
Than an Hour”
https://youtu.be/2olsGf6JIkU
Stephan T. Lavavej - Standard Template Library (STL)
https://bit.ly/2fS8u8c
Stephan T Lavavej - Advanced STL
https://bit.ly/2fS5lFF
其实 STL 粗略来分有 Algorithm 以及 Container 两部分, 使用
Container 不只需要有部分资料结构的基础, 也要知道 concept
这个观念, 知道在 template 里有对参数型别依赖哪些操作之后,
就可以进一步学习使用 Algorithm. Algorithm 架构在两个基本
concept 之上 (当然其他还有很多):
1. iterator
2. range
iterator (迭代器) 是类指标物件, 用来指向容器里的物件, 你可
以用 operator++ 让迭代器指向容器里下个物件(概念上), 而不用
在意容器实际上是由什么资料结构实作而来. range 这个概念最简
单的描述就是:
有一个物件集合, 可以用两个迭代器去描述, 其中一个开
始迭代器指向集合中的第一个物件, 另一个结束迭代器则
用来指向最后一个物件的后方. 你可以将开始迭代器不断
地叠加, 直到它指向结束迭代器为止, 如此就完成寻访集
合里的所有物件. 以数学表示大概是 [first, last)这样
的半开区间 (容器也会提供这样成对的迭代器)
近年来 C++ Community 也在提倡多使用 Algorithm 来取代重复的
程式码, 一方面可以提升可读性, 另一方面也省去不必要的物件定
义. 以简单的数偶数来说, 你可能会这样写:
1 std::array<int, 5> values{1, 2, 3, 4, 5};
2
3 unsigned even = 0u; // what type should I use?
4 for (auto v : values) {
5 if (v % 2 == 0) { // core logic #1: operate on evens
6 ++even; // core logic #2: count things
7 } // #1 + #2: count evens
8 }
9 // 'even' finally available now
你会发现我们在第 3 行定义了 even 变量, 但是要到第 9 行它的
值才是有意义的, 然后必须将循环一层层分解看到第 6 行才能知
道它在作什么, 这边可以用 std::count_if() 来改写:
1 auto const even = std::count_if(
2 std::begin(values), std::end(values),
3 [] (auto v) { return v % 2 == 0; }
4 );
读作: count from begin of values to end of
values if v % 2 == 0
然后在 C++20 你可以进一步简化 (或是用 Boost.Range):
1 auto const even = std::ranges::count_if(
2 values, [] (auto v) { return v % 2 == 0; }
3 );
读作: count all values if v % 2 == 0
使用 lambda 不仅可以清楚表达核心逻辑, 读码也可以较快切入重

参考资料:
Working Draft (N4789)
http://eel.is/c++draft/alg.count
The One Ranges Proposal (P0896R3)
https://bit.ly/2KGsMma
作者: eye5002003 (下一夜)   2018-11-30 13:10:00
我到现在还是无法习惯这些用法
作者: uranusjr (←這人是超級笨蛋)   2018-11-30 13:31:00
很遗憾的这是时代的趋势 (C++ 以外的语言也有类似进化)
作者: F04E (Fujitsu)   2018-11-30 15:43:00
您是好人
作者: soheadsome (师大狗鼻哥)   2018-11-30 19:28:00
js圈会跟你说这是reactive programming
作者: descent (“雄辩是银,沉默是金”)   2018-11-30 21:03:00
看不懂, 还是觉得第一种写法好懂而且任何语言用可以用
作者: art1 (人,原来不是人)   2018-11-30 22:55:00
对最后一种最有感觉,短的程式码比较容易懂?
作者: ilikekotomi (Young)   2018-11-30 23:08:00
先推 有空再来看影片
作者: steve1012 (steve)   2018-12-01 00:13:00
越长的程式码越容易出错
作者: TitanEric (泰坦)   2018-12-01 11:54:00
感谢分享

Links booklink

Contact Us: admin [ a t ] ucptt.com