Boost的最常用零件


115

当我发现boost::lexical_cast自己时,心想:“为什么我不早知道呢!” -我讨厌像这样写代码

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

现在我写

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

昨天,在stackoverflow上,我遇到了boost split(另一个可以节省我编写代码的宝石)。

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文档,寻找可以经常使用的其他功能,但是我觉得很容易错过一些东西。

您最常使用/什么讨厌的增强功能?


1
出于兴趣,什么原因阻止了您在使用Boost之前编写自己的“将数字转换为字符串”功能?我已经看到了重复项,并编写了一个简单的模板并使用了它,然后,当我找到它时,便切换到了增强版本……
Len Holgate

4
嗨,雷恩,在不同的时间,在不同的项目上,我编写了一个模板化的“ ToStr”函数,但是随后我将继续进行其他项目,然后最终编写3-liner,因为我只想把这些事情做完:- ),而不是创建“ misc_funcs”文件的开销
hamishmcn,

Answers:


62

对我而言,最有用的boost部分是boost :: shared_ptr


13
也可能是最过度使用的。我本人通过必须通过引用,指针容器和auto_ptr来重构shared_ptr的大多数用法而辛苦地学习了这一课。我现在基本上都同意这一点:Bureau14.fr/blogea/index.php/2009/08/…–
amit

1
@phaedrus:更新链接:blogea.bureau14.fr/index.php/2009/08/...
MatthewD

4
在具有std::shared_ptr和的C ++ 11中不再相关std::unique_ptr
einpoklum's


34

我的最爱,没有特别的顺序:

  • 正则表达式
  • 文件系统
  • 线
  • lexical_cast
  • program_options(太棒了!)
  • 测试(满足我所有的单元测试需求)。
  • 字符串算法
  • 字符串标记器
  • 格式(类型安全的printf样式字符串格式)
  • 智能点

当我编写我的第一个跨平台应用程序时,Boost是一个巨大的帮助-没有它,我真的会很努力。


4
请更新C ++ 11 / C ++ 14 ...
einpoklum

28

我喜欢您可以为自己提供析构函数的方法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" );
}

1
我知道已经快两年了,但是...的分配NULL没有用,因为它分配了局部函数参数。:)
Xeo 2012年

1
谢谢@Xeo,我已将其删除
hamishmcn 2012年

22

没有人提到多索引容器,所以我迟来会很高兴。并不是经常需要它们,但是如果没有增强,创建等效的数据结构以及降低效率是一个真正的痛苦。我最近一直在使用它们来创建可以查看2个键的容器。


20

我很惊讶没有人提及boost::optional。我发现自己使用它的次数要比Boost的任何部分都要多,除了shared_ptrscoped_ptr


1
现在可以使用std::experimental::optional(C ++ 17?)std::optional
einpoklum's

1
是的,对此我感到非常高兴。:-)尽管考虑到标准和在我使用的所有编译器中全面实施之间的延迟,但是仍然需要一段时间才能依靠它...我才能够开始在C ++ 11上使用去年的一个项目。:-(
怪胎之星

实际上,我认为最近几年大多数编译器都可以满足标准-GCC和clang在发布时支持C ++ 14,不是吗?无论如何,请考虑将您的评论整合到您的答案中。
einpoklum's

@HeadGeek有趣的是,在8年后看到新评论添加到您的答案中,您做出了回应!
德庆

哇...我想这已经8年了。就像青蛙青蛙科密特(Kermit the Frog)所说的那样,时间过得真有趣。;-)
怪胎之星

19

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


2
现在可作为std::tuple
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

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


5
BOOST_MPL_ASSERT_MSG允许非常容易地读取/发现错误,这些错误比BOOST_STATIC_ASSERT给出的不完整类型消息的大小更具信息性。
KitsuneYMG,2009年

这儿这儿!我只是在测试宏BOOST_CHECK_CLOSE中发现了这些不完整的类型错误之一-我花了半天的时间弄清楚发生了什么,然后才用(int,int,float)调用它;一旦我将整数转换为浮点数,错误就会消失。但这与我不知道的不完整类型有关:)
Jamie Cook 2010年

9

我最常用的工具之一不是在Boost中使用的,而是在Boost 之上构建的Adobe Source Libraries(ASL),特别是对接受boost :: range代替单独的begin / end迭代器的标准算法的扩展。然后,而不是打电话说

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

我可以简单地说

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

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


我喜欢,我将检查ASL
hamishmcn 2010年

8

我经常使用:

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

如果要编写要在各种平台上使用的库,则诸如Tuple,Static Assert和Integer之类的其他类将非常有用。

诸如Graphs和Lambda之类的事情更为具体。


请针对这几天的C ++ 11/14更新(或考虑删除答案)。
einpoklum

8

boost::shared_ptr是现代C ++编程恕我直言的要求。这就是为什么他们使用TR1将其添加到标准中的原因。boost::program_optionsboost::bindboost::signal,如果您知道它们的用途以及使用方法,那将非常好。最后两个往往会吓到新来者。


7

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



7

我已经使用了shared_ptr多年了。它是如此有用,没有理由使项目没有它。

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

最终,就在前几天,我在愤怒中使用Variant解决了一个问题(一个解析器可以用少量固定的不相关令牌类型进行响应)。该解决方案非常优雅,对此我感到非常满意。


几年过去了,时间已经改变,所以有时间进行更新了。SharedPtr和Function现在是标准的一部分,而Bind和Lambda被实际的语言级lambda功能所取代。

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

我使用的Boost的主要部分是Boost.Asio。这正在被标准化。


1
我同意以上所有内容-除了Lambda。我使用了一段时间,但它是如此曲折,以至于我已经放弃了所有最简单的表达方式。急切地等待C ++ 0x及其lambda表达式的形式。
怪胎头

我同意Boost.Lambda充满各种陷阱-一旦我进入Unlambda或Protect的领域,我就放弃并以旧的方式进行操作,但是对于以任何体面的方式扩展回调似乎都是必不可少的。也就是说,我也等待C ++ 0x实现。
卡兹龙

6

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

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

使用boost分配,我可以像这样初始化地图:

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

并使用范围适配器和pipe(“ |”)运算符,我可以向后遍历map的值(例如):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }

1
太棒了。它使我通读了有关升压分配的文档:boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn 2012年


5

我优先使用Boost Pointer Containers而不是shared_ptrS 的STL容器。



3

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


6
智能指针是RAII。

4
更精确地讲,智能指针只能在动态分配内存的情况下为您提供RAII。
Branan

3

好了,这是一个新的我发现:
而不是使用stricmp我可以使用提升的平等作用,并通过在is_iequal谓
如:
代替

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

我可以用

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

给出:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;

3

这是我的两分钱:

  • boost :: scope_exit-无需只为一种用途定义RAII类
  • 提高::任何
  • boost :: variant
  • Boost Pointer容器库(ptr_vector)
  • 增强池库
  • boost :: unordered_map / boost :: unordered_set

3

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

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

boost::function并且boost::bind是绝对必须的。尽管现在他们std::functionstd::bind。这些确实有助于减少不必要的代码量,并且通常对我的设计(或我的错觉)都有利。

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

我会使用更多的东西,但是Qt具有原生的方式来做Boost做的很多事情。如果我不得不编程纯C ++,我想我会成为一个boost::junkie:)


3

现在,TR1提供了我最常使用的功能:

  • 共享指针
  • 数组类

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

您现在已经了解到Boost对大多数程序员而言都是有用的,这就是为什么它是未来标准库的测试平台。


1

在谈论boost :: lexical_cast时,为什么在std :: string库中不像'format'这样的静态成员呢?
几乎所有的gui库都有类似CString :: Format(“%i”)或QString :: Number(“%i”)之类的东西,它们返回初始化的字符串。


4
例如: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
罗布

如果您愿意放弃类型安全性,则可以使用vsnprintf(),省略号(...),va_list / stdarg.h和本地(基于堆栈的)缓冲区进行滚动。
Ree先生

2
std :: string已经具有71个函数(根据Herb Sutter的计数,不是我的)。看到详细信息, gotw.ca/gotw/084.htm:我认为它具有足够的信息来解释(a)为何格式不必使用std :: string,以及(b)为什么编写比类成员更好的泛型算法反正功能。
史蒂夫·杰索普

4
或者换一种说法,“ C ++就像一个外国:他们在那里做事不同” ;-)
史蒂夫·杰索普

1
Format不是库的一部分,因为Stroustrup在设计C ++时面临的挑战之一是构造类型安全的格式化I / O库。显然,结果就是您在iostream中看到的结果。显然,当时没有人想到插值。也许有人想编写一个formatstream,以使传统主义者感到宾至如归?
菲尔·米勒

1

我认为这个问题应该扭转。您不想使用助推器的哪一部分?

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

您应该花时间在Boost文档周围,以找到满足您兴趣的领域。

一个例外可能boost::numeric::ublas是它的工作,但Eigen的确做得更好。


我怀疑octonion库是否被许多人使用。
皮特2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.