当我发现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文档,寻找我能够定期使用的其他功能,但我觉得很容易错过。
你最常使用哪些增强功能/不想拥有?
答案 0 :(得分:61)
对我来说,最常用的提升部分可能是boost::shared_ptr。
答案 1 :(得分:48)
BOOST_FOREACH让生活变得有价值。
(为什么没有人提到这个?8个月前问了这个问题!)
答案 2 :(得分:33)
我的喜欢没有特别的顺序:
答案 3 :(得分:27)
我喜欢你如何为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" );
}
答案 4 :(得分:21)
没有人提到Multi-Index Containers因此我会迟到。通常情况下,您不需要它们,但如果没有提升,创建等效数据结构以及效率降低真的很痛苦。我最近一直在使用它们来创建可以查看2个键的容器。
答案 5 :(得分:20)
我很惊讶没有人提到boost::optional
。除了shared_ptr
和scoped_ptr
之外,我发现自己比Boost的任何部分更频繁地使用它。
答案 6 :(得分:19)
没人提到boost :: tuple?羞耻!
答案 7 :(得分:10)
更新(2011年10月):C ++ 11(C ++ 0x)有static_assert
http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert
答案 8 :(得分: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。)
答案 9 :(得分:7)
我很惊讶在答案Boost.Thread之间还没有看到。
答案 10 :(得分:7)
我们发现boost :: spirit对于解析ECMAScript的业务解决方案非常有用。复杂,但非常好!
答案 11 :(得分:7)
我经常使用:
如果你正在编写一个可以在各种平台上使用的库,那么像Tuple,Static Assert和Integer这样非常有用。
Graphs和Lambda之类的东西更具体。
答案 12 :(得分:7)
boost::shared_ptr
是现代C ++编程恕我直言的要求。这就是他们将其添加到TR1标准的原因。 boost::program_options
,boost::bind
和boost::signal
非常好,如果您知道它们的用途以及如何使用它们。最后两个往往会吓到新人。
答案 13 :(得分:6)
我多年来一直在使用shared_ptr。它非常有用,没有理由说项目应该没有它。
除此之外,我还使用Bind / Function / Lambda作为通用回调机制 - 在测试时特别有用 - 以及我的通用sprintf替换格式。
最后,就在前几天,当我在愤怒中使用Variant来解决问题时(一个可以用一组固定的小型无关令牌类型进行响应的解析器)。解决方案非常优雅,我对它非常满意。
答案 14 :(得分:5)
我使用Boost指针容器优先于shared_ptr
的STL容器。
答案 15 :(得分:5)
你应该检查boost :: program_options。它使命令行解析更容易。
答案 16 :(得分:5)
使用元组迭代地图,如下所示:
string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }
使用提升分配,我可以初始化这样的地图:
map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");
使用范围适配器和管道(“|”)运算符,我可以向后迭代地图的值(作为示例):
BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }
答案 17 :(得分:4)
答案 18 :(得分:3)
这是我的两分钱:
答案 19 :(得分:3)
我使用boost::icl
进行文本后期处理。节省了我很多时间,因为否则我必须自己实施文本分割...
BOOST_FOREACH
在我的代码中无处不在:)
boost::function
和boost::bind
是绝对必须的。虽然现在它们是std::function
和std::bind
。这些确实有助于减少不必要的代码量,通常对我的设计(或我的妄想)有好处。
我最近开始使用boost::interprocess::message_queue
,这也是一个很棒的工具。
我会使用更多,但Qt本身就可以做很多事情。如果我必须编写纯C ++编程,我想我会成为boost::junkie
:)
答案 20 :(得分:3)
好的,这是我发现的一个新词:
而不是使用 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;
答案 21 :(得分:3)
我喜欢boost :: random和boost :: asio和boost :: filesystem,但是boost :: bind,boost :: circular_buffer和boost :: thread非常实用,智能指针还可以,但我更喜欢RAII而不是内存管理
答案 22 :(得分:3)
我最常用的是现在TR1:
现在我还使用了池类和其他一些更具体的东西。
你现在明白Boost对大多数程序员来说是有用的,这就是为什么它是未来标准库的试验台。
答案 23 :(得分:1)
我认为应该颠倒这个问题。如果你不希望使用哪个部分?
根据我的经验,几乎所有这些都在每个问题领域都很有趣且有用。
您应该花时间查看提升文档,找到符合您兴趣的区域。
一个例外可能是boost::numeric::ublas
这是它的工作,但Eigen做得非常好。
答案 24 :(得分:1)
谈到boost :: lexical_cast,为什么'格式'不是std :: string库中的静态成员?
几乎所有的gui libs都有类似CString :: Format(“%i”)或QString :: Number(“%i”)的东西,它们返回一个初始化的字符串。