返回介绍

4.6 C++11:标准库组件

发布于 2024-08-19 12:44:37 字数 3830 浏览 0 评论 0 收藏 0

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 把依赖于时钟的嘀嗒节拍数转换为程序员选用的时间单位。

使用如此简单的代码,你可以让大一学生都能感受到不同算法和数据结构的代价差异。chronothread 库提供了时间支持(§4.1.2)。

到了 C++20,chrono 得到进一步增强,加入了处理日期和时区的功能(§9.3.6)。C++20 也允许把上面的例子简化为:

cout << t1-t0 << '\n';

这就会把 t0t1 之间的时间差自动以合适的单位进行输出。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文