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_ptr
和scoped_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_options
, boost::bind
和boost::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做得更好。
- 使shared_ptr不使用删除
- 你如何在MacOS上安装Boost?
- 更多精神疯狂 – parsing器types(规则vs int_parser <>)和元编程技术
- boost.org的Spirit parser-generator框架的缺点是什么?
- boost :: function和boost :: bind是如何工作的
- 致命错误LNK1104:无法打开文件'libboost_system-vc110-mt-gd-1_51.lib'
- 在C ++ Boost库中,为什么某些头文件中存在“.ipp”扩展名
- 为什么提高属性树write_json保存一切为string? 有没有可能改变这一点?
- 如何解码boost库命名?