53

自从我开始使用这个站点以来,我不断听到关于 Boost 库的消息。我想知道 Boost 库的一些主要好处是什么(因此我为什么要使用它)以及 Boost 库的可移植性如何?

4

12 回答 12

69

Boost 由标准委员会的几位成员组织。
因此,它是下一个标准中图书馆的温床。

  1. 它是 STL 的扩展(它填补了遗漏的位)
  2. 这是有据可查的。
  3. 它得到了同行评议。
  4. 它具有很高的活动性,因此可以快速找到并修复错误。
  5. 它是平台中立的,适用于任何地方。
  6. 它可以免费使用。

随着 tr1 即将推出,很高兴知道 boost 已经覆盖了很多领域。tr1 中的很多库基本上都是直接从 boost 原件改编而来的,因此已经过尝试和测试。不同之处在于它们已被移至 std::tr1 命名空间(而不是 boost)。

您需要做的就是将以下内容添加到您的编译器默认包含搜索路径中:

<boost-install-path>/boost/tr1/tr1

然后,当您包含标准标头时,boost 将自动将所有必需的东西导入命名空间 std::tr1

例如:

要使用 std::tr1::share_ptr 你只需要包含 <memory>。这将为您提供一个文件的所有智能指针。

于 2008-09-29T15:48:33.140 回答
19

您可以简单地阅读Boost 背景信息页面,快速了解为什么应该使用 Boost 以及可以将其用于什么用途。值得花几分钟。

于 2008-09-29T15:48:14.700 回答
16

99% 便携。

我想说的是,一旦你发现了通过 boost 解决的需求,它就有很多真正有用的库。您可以自己编写代码,也可以使用非常可靠的库。拥有像 Multi-Index、Lambda、Program Options、RegEx、SmartPtr 和 Tuple 这样的现成资源真是太棒了……

最好的办法是花一些时间浏览不同库的文档并评估它是否对您有用。

值得!!

于 2008-09-29T15:52:35.920 回答
15

Boost 很棒,但只是在这里玩 Devil's Advocate 是您可能不想使用 Boost 的一些原因:

  • 有时无法在旧编译器上编译/正常工作。
  • 它通常比使用较少模板的方法增加编译时间更多。
  • 某些 Boost 代码可能不会像您认为的那样做。阅读文档!
  • 模板滥用可能导致无法阅读的错误消息。
  • 模板滥用会导致代码难以在调试器中单步执行。
  • 它是最前沿的 C++。下一个版本的 Boost 可能不再在您当前(旧)的编译器上编译。

所有这一切并不意味着即使您不按原样使用 Boost,您也不应该查看 Boost 代码并自己获得一些想法。

于 2008-09-29T20:51:54.640 回答
13

你会得到很多 C++0x 中的东西。但除了一般性之外,一些更好的细节是一个简单的正则表达式库,一个用于从字符串转换为整数(词法转换)的转换库:

int iResult = 0;
try
{
    iResult = lexical_cast<int>("4");
}
catch(bad_lexical_cast &)
{
    cout << "Unable to cast string to int";
}

日期/时间库等...

using namespace boost::gregorian;
date weekstart(2002,Feb,1);
date thursday_next = next_weekday(weekstart, Thursday); // following Thursday

还有一个Python 接口(Boost Python),一个词法分析器/解析器 DSL(Boost Spirit):

// A grammar in C++ for equations
group       = '(' >> expression >> ')';
factor      = integer | group;
term        = factor >> *(('*' >> factor) | ('/' >> factor));
expression  = term >> *(('+' >> term) | ('-' >> term));

而这只是表面上的问题......

于 2008-09-29T15:46:22.363 回答
12

Boost 是 C++ 库的集合。其中 10 个包含在 C++0x 的 tr1 中。

您可以在此处开始使用 boost

于 2008-09-29T15:45:19.497 回答
7

Boost是一组高质量的同行评审 C++ 库,它们强调可移植性和正确性。它是语言和标准库新增功能的事实上的试验场。查看他们的网站了解更多详情。

于 2008-09-29T15:49:11.967 回答
5

Boost 的优点:它广泛可用,可以移植到任何现代 C++ 编译器或任何平台。
这些功能与平台无关,您不必为每个新框架学习新的线程设计。
它以标准方式封装了许多特定于平台的功能,例如文件系统。

这是 C++ 应该附带的!Java 的很多流行之处在于它附带了一个标准库,可以做几乎所有你想做的事情。不幸的是,C++ 只继承了有限的 C/Unix 标准函数。

于 2008-09-29T15:50:39.123 回答
4

shared_ptrweak_ptr,尤其是在多线程代码中,单独值得安装 boost。 BOOST_STATIC_ASSERT做编译时逻辑检查也很酷。

boost 中的许多类和实用程序都在标头中,这意味着您无需编译任何东西就可以获得很多功能,这也是一个优点。可移植性通常不是问题,除非您使用非常旧的编译器。我曾经试图让 MPL 与 VC6 一起工作,它在完全爆炸之前打印出 40,000 个警告/内部错误。但总的来说,无论您的平台或编译器供应商如何,大多数库都应该可以工作。

考虑到 Boost 中的很多东西已经在 TR1 中,并且很可能会出现在 C++ 标准库的下一个版本中。这是一个相当大的认可。

于 2008-11-08T22:18:02.910 回答
3

Boost 是一个非常广泛的(通常)通用结构库,可以帮助几乎任何应用程序。这可以从 C++ 0x 规范中包含许多 boost 组件这一事实来证明。

它也至少可以在主要平台上移植,并且应该可以移植到几乎任何具有大多数标准兼容的 C++ 编译器的东西。

唯一的警告是 boost 库之间可能有很多混合的依赖关系,这使得只选择一个特定的组件来分发(而不是整个 boost 库)变得更加困难。

于 2008-09-29T15:47:08.710 回答
3

以上所有,加上它鼓励了许多现代的、最佳实践的 C++ 技术。它倾向于提高代码的质量。

于 2008-09-29T16:11:23.613 回答
1

另请注意,大多数 boost 是模板,因此不需要构建
(只需包含正确的头文件)。

The few parts that do require building are optional:
These can each be built independently thus preventing unnecessary bloat for unneeded code.

于 2009-01-19T10:06:00.143 回答