Boost最常用的部分

当我发现boost::lexical_cast我心想:“我为什么不早点知道这个呢?” – 我讨厌不得不写代码

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

现在我写

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

昨天,在stackoverflow,我遇到了提升分裂(另一个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文档,寻找其他可以定期使用的函数,但是我觉得这会很容易错过。

你最不喜欢使用哪种助推function?

boost的最常用部分可能是boost :: shared_ptr 。

BOOST_FOREACH再次让人生值得。

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

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

  • 正则expression式
  • 文件系统
  • 线
  • lexical_cast的
  • program_options(只是辉煌!)
  • testing(所有我的unit testing需求)。
  • stringalgorithm
  • string标记器
  • 格式(types安全的printf风格string格式)
  • 智能ptrs

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

我喜欢你如何为shared_ptr提供你自己的析构函数。
这意味着,例如,您可以将它与FILE*一起使用,并让它为您closures文件。
例如

 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" ); } 

没有人提到多指标容器,所以我迟到了。 并不是经常需要它们,但是如果没有提升,创build一个等效的数据结构是一个真正的痛苦,而且效率也会降低。 我最近一直在使用它们来创build查找2个键的容器。

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

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

BOOST_STATIC_ASSERT

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

我最常用的一种不是Boost,而是Adobe Booster(ASL) ,它是在Boost的基础上构build的,特别是接受boost :: range的标准algorithm的扩展,代替了单独的begin / end迭代器。 然后,而不是打电话说,

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

我可以简单地说

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

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

我用了很多:

  • 提高::信号
  • 提高:: shared_ptr的
  • 提高:: lexical_cast的
  • 提高::绑定
  • 提高::随机
  • 提高::螺纹
  • 提高::不可复制

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

Graphs和Lambda等更具体。

boost::shared_ptr是现代C ++编程恕我直言的要求。 这就是为什么他们把它添加到TR1的标准。 boost::program_optionsboost::bindboost::signal是非常好的,如果你知道它们是什么以及如何使用它们。 最后两个人往往会吓倒新人。

我们发现boost :: spirit对parsingECMAScript的商业解决scheme非常有用。 复杂,但非常好!

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

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

最重要的是,我还使用Bind / Function / Lambda作为通用的callback机制 – 在testing时特别有用 – 以及用于通用sprintfreplace的Format。

最后,就在那天我用Variant来解决一个问题(一个parsing器可以用一个小的,固定的无关的标记types来响应)。 解决scheme非常优雅,我对此非常满意。

你应该检查boost :: program_options。 它使命令行parsing更容易。

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

 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道(“|”)运算符,我可以遍历一个映射的值(作为一个例子):

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

我使用Boost指针容器优先于shared_ptr的STL容器。

我用了很多boost :: numeric :: ublas :: matrix 。

我最常用的是TR1:

  • 共享指针
  • 数组类

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

你现在明白,提升对大多数程序员来说是有用的,这就是为什么它是未来标准库的testing平台。

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

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

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

我可以用

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

给定:

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

这是我的两分钱:

  • boost :: scope_exit – 不需要为一次使用定义RAII类
  • 提高::任何
  • 提高::变种
  • 升压指针容器库(ptr_vector)
  • 提升游泳池图书馆
  • boost :: unordered_map / boost :: unordered_set

我使用boost :: icl相当多的文本后处理。 为我节省了很多时间,否则我将不得不实施文本分割…

BOOST_FOREACH无处不在我的代码:)

boost :: function和boost :: bind是绝对必须的。 虽然现在他们是std :: function和std :: bind。 这些确实有助于减less不必要的代码量,对于我的devise(或者我的错觉)来说通常都是很好的。

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

我会用更多的,但Qt本身的方式做了很多东西提升。 如果我必须编程纯粹的c + +我想我会成为boost :: junkie 🙂

谈到boost :: lexical_cast,为什么不像std :: string库中的“format”静态成员那样?
几乎所有的GUI库都有类似CString :: Format(“%i”)或QString :: Number(“%i”),它们返回一个初始化的string。

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

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

你应该花些时间在助推文件周围find涵盖你的兴趣领域。

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