4.6 C++11:标准库组件
C++ 跟其他现代语言比一直有个小巧的标准库。此外,大多标准库组件都很基础,而不是试图处理应用层面的任务。不过,C++11 增加了几个关键的库组件来支持特定任务:
thread
——基于线程和锁的并发regex
——正则表达式chrono
——时间random
——随机数产生器和分布
和大量的商业支持程序库相比,这显然小得可怜,但这些组件质量很高,并且跟之前的标准 C++ 相比数量也多多了。
设计这些组件,是要服务于一些特定任务。在这些任务中,它们为程序员提供了重大帮助。遗憾的是,这些库来自不同背景,体现在接口风格上,就出现了差 异;除了要灵活和高性能之外它们没有一致的整体设计哲学。C++11 在合入一个组件方面没有明晰的标准(C++98 有一些 [Stroustrup 1994])。更准确地说,我们只是从现有的、已被社区证明成功的组件中接收组件进来。很多组件来自 Boost(§2.3)。
如果你需要使用正则表达式,标准库中新加入的 regex
就是个巨大改进了。类似,加入无序容器(哈希表),如 unordered_map
,为很多程序员省去了大量繁琐的工作,使之可以产出更好的程序。然而,这些库组件并没有对人们组织代码的方式产生重大影响,所以我在此不对这些库组件的细节展开讨论。
regex
库主要是 John Maddock 的工作 [Maddock 2002]。
哈希表不巧错过了 C++98 的截止时间,因而出现在了 C++0x 的第一批提案之中 [Austern 2002]。它们被称做无序的(例如 unordered_map
),是为了区别于老的、有序的标准容器(例如 map
),也是因为较明显的名字(例如 hash_map
)已经在 C++11 之前被其他库大量使用了。另外,unordered_map
也可以说是个更好的名字,因为它指出了类型提供什么,而不是它是如何实现的。
random
库提供了分布函数和随机数产生器,其复杂性被誉为每个随机数库都想长成的样子
。但它对初学者或者一般用户(常需要随机数)并不易用。它在 2002 年由 Jens Maurer [Maurer 2002] 提出,并在 2006 年经由费米国家实验室的一群人修订 [Brown et al. 2006],随即被接受。
相比之下,Howard Hinnant 的 chrono
库 [Hinnant et al. 2008] 处理时间点和时间间隔,在提供复杂功能的同时仍保持了易用性。例如:
using namespace std::chrono; // 在子命名空间 std::chrono
auto t0 = system_clock::now();
do_work();
auto t1 = system_clock::now();
cout << duration_cast<milliseconds>(t1-t0).count() << "msec\n";
其中的 duration_cast
把依赖于时钟的嘀嗒
节拍数转换为程序员选用的时间单位。
使用如此简单的代码,你可以让大一学生都能感受到不同算法和数据结构的代价差异。chrono
为 thread
库提供了时间支持(§4.1.2)。
到了 C++20,chrono
得到进一步增强,加入了处理日期和时区的功能(§9.3.6)。C++20 也允许把上面的例子简化为:
cout << t1-t0 << '\n';
这就会把 t0
和 t1
之间的时间差自动以合适的单位进行输出。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论