我无法理解Scheme中收集器函数的使用.我正在使用"The Little Schemer"一书(Daniel P. Friedman和Matthias Felleisen).一个有一些解释的综合例子对我有很大帮助.使用收集器函数的函数示例如下:
(define identity
(lambda (l col)
(cond
((null? l) (col '()))
(else (identity
(cdr l)
(lambda (newl)
(col (cons (car l) newl))))))))
Run Code Online (Sandbox Code Playgroud)
......有一个例子叫做存在(identity '(a b c) self)和self-function存在(define self (lambda (x) x)).该identity函数返回给定的列表l,因此给定调用的输出将是(a b c).使用的确切语言是R5RS Legacy语言.
有一个6.53 GiB的大文本文件.它的每一行都可以是数据行或注释行.注释行通常很短,少于80个字符,而数据行包含超过200万个字符并且是可变长度的.
考虑到每条数据线需要作为一个单元来处理,有一种简单的方法可以在C++中安全快速地读取线路吗?
安全(对于可变长度数据线是安全的):该解决方案同样易于使用std::getline().由于长度在变化,因此希望避免额外的内存管理.
快:该解决方案可以快速实现与readline()中python 3.6.0,甚至一样快fgets()的stdio.h.
欢迎使用Pure C解决方案.用于进一步处理的接口以C和C++提供.
更新1:感谢Basile Starynkevitch的简短而宝贵的评论,出现了完美的解决方案:POSIX getline().由于进一步处理只涉及从字符转换为数字而不使用字符串类的许多功能,因此在此应用程序中使用char数组就足够了.
更新2:感谢来自评论Zulan和Galik,谁既报告中相当的性能std::getline(),fgets()并且POSIX getline(),另一种可能的解决方案是使用一个更好的标准库的实现,例如libstdc++.此外,这里有一份报告声称Visual C++和libc ++实现std::getline没有得到很好的优化.
从中移动libc++来libstdc++改变结果很多.与libstdc ++ 3.4.13/Linux 2.6.32在不同的平台上POSIX getline(),std::getline()并fgets()显示可比的性能.开始时,代码在Xcode 8.3.2(8E2002)中的clang的默认设置下运行,因此libc++被使用.
更多细节和一些努力(很长):
getline()的<string>可以处理任意长的线,但有点慢.readline()在python 中有C++的替代品吗?
// benchmark on Mac …Run Code Online (Sandbox Code Playgroud)