117

当我发现时,boost::lexical_cast我心想“为什么我不早点知道这件事!” - 我讨厌不得不编写类似的代码

stringstream ss;
ss << anIntVal;
mystring = ss.str();

现在我写

mystring = boost::lexical_cast<string>(anIntVal);

昨天,在 stackoverflow 上,我遇到了 boost split(另一个可以帮助我编写代码的 gem)。

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

我将开始查看 boost 文档,寻找我可以经常使用的其他功能,但我觉得很容易错过一些东西。

您最常使用/不想拥有哪些增强功能?

4

25 回答 25

63

对我来说,boost 最常用的部分可能是boost::shared_ptr

于 2008-11-28T14:38:56.427 回答
50

BOOST_FOREACH让生活再次变得有价值。

(为什么没有人提到这个?这个问题是8个月前提出的!)

于 2009-08-07T17:19:51.077 回答
37

我最喜欢的是,没有特别的顺序:

  • 正则表达式
  • 文件系统
  • 线
  • lexical_cast
  • 程序选项(太棒了!)
  • 测试(满足我所有的单元测试需求)。
  • 字符串算法
  • 字符串分词器
  • 格式(类型安全的 printf 样式字符串格式)
  • 智能指针

当我编写我的第一个跨平台应用程序时,Boost 提供了巨大的帮助——如果没有它,我真的会很挣扎。

于 2008-11-28T16:01:19.273 回答
29

我喜欢你如何为shared_ptr.
这意味着,例如,您可以使用它FILE*并让它为您关闭文件。
例如

void safeclose(FILE*fp) {
    if(fp) {
        fclose(fp);
    }
}
void some_fn() {
    boost::shared_ptr<FILE> fp( fopen(myfilename, "a+t"), safeclose );
    //body of the function, and when ever it exits the file gets closed
    fprintf( fp.get(), "a message\n" );
}
于 2010-03-05T03:46:14.560 回答
22

没有人提到多索引容器,所以我会晚点说。您并不经常需要它们,但如果没有提升,创建等效数据结构是一件非常痛苦的事情,而且效率较低。我最近一直在使用它们来创建查找 2 个键的容器。

于 2009-02-10T17:45:16.457 回答
20

我很惊讶没有人提到boost::optional. 我发现自己比 Boost 的任何部分都更频繁地使用它,除了shared_ptrscoped_ptr.

于 2008-11-30T02:01:01.480 回答
19

没有人提到 boost::tuple?耻辱!

于 2008-11-28T16:05:37.470 回答
11

BOOST_STATIC_ASSERT

更新(2011 年 10 月):C++11 (C++0x) 有static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert

于 2008-11-28T23:14:39.850 回答
9

我最常用的一个不是 Boost 本身,而是构建在 Boost 之上的Adob​​e Source Libraries (ASL) — 特别是标准算法的扩展,它接受 boost::range 代替单独的开始/结束迭代器。然后,而不是打电话,说,

std::for_each(some_container.begin(), some_container.end(), do_something());

我可以简单地说

adobe::for_each(some_container, do_something());

(我确实希望 ASL 的这些部分最终迁移到 Boost。)

于 2010-03-05T04:05:00.443 回答
8

我经常使用:

  • 升压::信号
  • boost::shared_ptr
  • boost::lexical_cast
  • 提升::绑定
  • 提升::随机
  • 提升::线程
  • 提升::不可复制

如果您正在编写一个将在各种平台上使用的库,其他像 Tuple、Static Assert 和 Integer 将非常有用。

Graphs 和 Lambda 之类的东西更具体。

于 2008-11-28T15:18:16.487 回答
8

boost::shared_ptr是现代 C++ 编程恕我直言的要求。这就是为什么他们将其添加到 TR1 的标准中。boost::program_options, boost::bind,boost::signal如果您知道它们的用途以及如何使用它们,它们真的很棒。最后两个往往会吓到新手。

于 2008-11-29T21:39:09.573 回答
7

我已经使用 shared_ptr 多年了。它非常有用,一个项目没有理由没有它。

最重要的是,我还将 Bind/Function/Lambda 用于通用回调机制——在测试时特别有用——以及用于我的通用 sprintf 替换的 Format。

最后,就在前几天,我愤怒地使用 Variant 来解决一个问题(一个解析器可以用一小部分固定的不相关标记类型进行响应)。该解决方案非常优雅,我对此感到非常满意。


几年过去了,时代变了,所以是时候更新了。SharedPtr 和 Function 现在是标准的一部分,而 Bind 和 Lambda 已被实际的语言级 lambda 功能所淘汰。

我仍然使用 Variant(也已标准化,但我还没有), Format 很大程度上被 fmtlib (也已标准化)取代。

我使用的 Boost 的很大一部分是 Boost.Asio。正在标准化的过程中。

于 2008-12-04T15:17:43.163 回答
7

我们发现 boost::spirit 对于解析 ECMAScript 的业务解决方案非常有用。复杂,但非常好!

于 2010-03-09T18:17:29.837 回答
7

我很惊讶在答案Boost.Thread之间还没有看到。

于 2010-04-20T15:49:15.353 回答
6

使用元组迭代地图,如下所示:

string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }

使用 boost assign,我可以像这样初始化一个地图:

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

并且使用范围适配器和 pipe("|") 运算符,我可以向后迭代地图的值(例如):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }
于 2012-01-15T08:06:52.733 回答
5

你应该检查 boost::program_options。它使命令行解析变得更加容易。

于 2010-03-05T04:45:36.060 回答
5

我使用 Boost Pointer Containers 而不是shared_ptrs 的 STL 容器。

于 2010-06-24T08:34:52.473 回答
4

我经常使用boost::numeric::ublas::matrix

于 2008-11-28T14:48:46.627 回答
3

我使用最多的现在在 TR1 中可用:

  • 共享指针
  • 数组类

现在我还使用池类和其他一些更具体的东西。

你现在明白了 Boost 对大多数程序员都是有用的,这就是为什么它是未来标准库的测试平台。

于 2008-11-28T14:41:04.083 回答
3

我喜欢 boost::random 和 boost::asio 和 boost::filesystem,但是 boost::bind 、 boost::circular_buffer 和 boost::thread 非常实用,智能指针还可以,但我更喜欢 RAII 作为内存管理

于 2008-11-28T14:42:20.477 回答
3

好的,这是我发现的一个新方法:我可以使用 boost 的equals函数并传入 is_iequal 谓词,而不是
使用stricmp , 例如: 而不是

stricmp( "avalue", mystr.c_str() ) == 0

我可以用

equals( "avalue", mystr, is_iequal() ) 

给定:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;
于 2009-02-10T17:17:14.247 回答
3

这是我的两分钱:

  • boost::scope_exit - 无需为一种用途定义 RAII 类
  • 提升::任何
  • 提升::变体
  • Boost 指针容器库 (ptr_vector)
  • Boost 池库
  • boost::unordered_map / boost::unordered_set
于 2011-07-13T09:04:43.453 回答
3

boost::icl在文本后处理中使用了很多。为我节省了很多时间,否则我必须自己实现文本分割......

BOOST_FOREACH在我的代码中无处不在:)

boost::function并且boost::bind是绝对必须的。虽然现在他们是std::functionstd::bind。这些确实有助于减少不必要的代码量,并且通常对我的设计(或我的妄想)有好处。

我最近开始使用boost::interprocess::message_queue,这也是一个很棒的工具。

我会使用更多,但 Qt 有本地方式来做 Boost 所做的很多事情。如果我必须编写纯 C++ 编程,我想我会成为boost::junkie:)

于 2012-09-05T19:53:02.493 回答
1

谈到 boost::lexical_cast,为什么 std::string 库中没有像“格式”这样的静态成员?
几乎所有的 gui 库都有类似 CString::Format("%i") 或 QString::Number("%i") 的东西,它们返回一个初始化的字符串。

于 2008-11-28T15:23:34.463 回答
1

我认为这个问题应该反过来。你不想使用你的哪一部分?

以我的经验,几乎所有这些在每个问题领域都是有趣和有用的。

您应该花时间查看 boost 文档,以找到您感兴趣的领域。

一个例外可能是boost::numeric::ublas它完成了它的工作,但Eigen做得非常好。

于 2010-11-19T00:16:42.480 回答