最常用的部分是Boost

时间:2008-11-28 14:36:30

标签: c++ boost

当我发现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文档,寻找我能够定期使用的其他功能,但我觉得很容易错过。

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

25 个答案:

答案 0 :(得分:61)

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

答案 1 :(得分:48)

BOOST_FOREACH让生活变得有价值。

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

答案 2 :(得分:33)

我的喜欢没有特别的顺序:

  • 正则表达式
  • filesystem
  • 螺纹
  • lexical_cast
  • program_options(太棒了!)
  • 测试(针对我所有的单元测试需求)。
  • 字符串算法
  • String tokenizer
  • 格式(类型安全的printf样式字符串格式)
  • smart ptrs
当我编写我的第一个跨平台应用程序时,Boost是一个巨大的帮助 - 没有它我真的会挣扎。

答案 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_ptrscoped_ptr之外,我发现自己比Boost的任何部分更频繁地使用它。

答案 6 :(得分:19)

没人提到boost :: tuple?羞耻!

答案 7 :(得分:10)

BOOST_STATIC_ASSERT

更新(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)

我经常使用:

  • 升压::信号
  • 升压:: shared_ptr的
  • 升压:: lexical_cast的
  • 升压::结合
  • 升压::随机
  • 升压::螺纹
  • 升压::不可复制

如果你正在编写一个可以在各种平台上使用的库,那么像Tuple,Static Assert和Integer这样非常有用。

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

答案 12 :(得分:7)

boost::shared_ptr是现代C ++编程恕我直言的要求。这就是他们将其添加到TR1标准的原因。 boost::program_optionsboost::bindboost::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)

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

答案 18 :(得分:3)

这是我的两分钱:

  • boost :: scope_exit - 无需仅为一次使用定义RAII类
  • 升压::任何
  • 升压::变体
  • 提升指针容器库(ptr_vector)
  • Boost Pool Library
  • boost :: unordered_map / boost :: unordered_set

答案 19 :(得分:3)

我使用boost::icl进行文本后期处理。节省了我很多时间,因为否则我必须自己实施文本分割...

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

boost::functionboost::bind是绝对必须的。虽然现在它们是std::functionstd::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”)的东西,它们返回一个初始化的字符串。