【问题标题】:Most used parts of Boost [closed]Boost最常用的部分[关闭]
【发布时间】:2010-09-24 11:08:48
【问题描述】:

当我发现boost::lexical_cast 时,我在想“我为什么不早点知道这件事!” - 我讨厌写像

这样的代码
stringstream ss;
ss << anIntVal;
mystring = ss.str();

现在开始写

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

昨天,在 stackoverflow 上,我遇到了 boost split(另一个可以节省我编写代码的 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 文档,寻找其他我可以经常使用的功能,但我觉得很容易错过一些东西。

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

【问题讨论】:

  • 出于兴趣,是什么阻止了您在使用 Boost 之前编写自己的“将数字转换为字符串”函数?我会看到重复并编写了一个简单的模板并使用它,然后,当我找到它时,也许会切换到 boost 版本......
  • 嗨 Len,在不同项目的不同时间,我编写了一个模板化的“ToStr”函数,但后来我会转到其他项目,然后最终编写 3-liner,因为我只是想要完成该死的事情:-) 而不是创建“misc_funcs”文件的开销

标签: c++ boost


【解决方案1】:

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

【讨论】:

【解决方案2】:

BOOST_FOREACH 让生活再次变得有价值。

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

【讨论】:

  • Eric Niebler 关于“有条件的爱”(artima.com/cppsource/foreach.html) 的文章描述了 BOOST_FOREACH 的工作原理。太疯狂了。
  • 在 C++11 和 lambdas 中不再那么流行...
【解决方案3】:

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

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

当我编写我的第一个跨平台应用程序时,Boost 提供了巨大的帮助 - 如果没有它,我真的会很吃力。

【讨论】:

  • 请更新 C++11/C++14...
【解决方案4】:

我喜欢你如何为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" );
}

【讨论】:

  • 我知道已经快两年了,但是......分配给NULL 是没有用的,因为它分配了本地函数参数。 :)
  • 谢谢@Xeo,我已经删除了
【解决方案5】:

没有人提到Multi-Index Containers,所以我晚点说。您并不经常需要它们,但是如果没有提升,创建等效的数据结构确实很痛苦,而且效率较低。我最近一直在使用它们来创建在 2 个键上查找的容器。

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 现在以std::experimental::optional 提供,很快(C++17?)以std::optional 提供。
    • 是的,我很高兴。 :-) 尽管考虑到标准之间的延迟以及在我使用的所有编译器中它们的完全实现,我仍然需要一段时间才能依赖它......我刚刚能够开始使用 C++11去年的一个项目。 :-(
    • 其实我认为大多数编译器都可以 w.r.t.近年来符合标准 - GCC 和 clang 在发布时支持 C++14,不是吗?无论如何,请考虑将您的评论整合到您的答案中。
    • @HeadGeek 有趣的是,8 年后在您的答案中添加了新评论,并且您做出了回应!
    • 哇...我猜它已经八年了。正如 Kermit the Frog 所说,当你有苍蝇时,时间很有趣。 ;-)
    【解决方案7】:

    没有人提到 boost::tuple?丢人现眼!

    【讨论】:

    • 现在可以使用std::tuple
    【解决方案8】:

    BOOST_STATIC_ASSERT

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

    【讨论】:

    • BOOST_MPL_ASSERT_MSG 允许非常容易阅读/发现错误,这些错误比 BOOST_STATIC_ASSERT 给出的不完整类型消息的大小提供更多信息。
    • 这里这里!我刚刚在测试宏 BOOST_CHECK_CLOSE 中发现了这些不完整的类型错误之一——我花了半天时间才弄清楚发生了什么,然后我才用 (int,int,float); 调用它。一旦我将整数转换为浮点,错误就消失了。但这与我真的不知道的不完整类型有什么关系:)
    【解决方案9】:

    我最常用的一个不是在 Boost 中,而是在 Boost 之上构建的 Adobe Source Libraries (ASL) — 特别是标准算法的扩展,它接受 boost::range 代替单独的开始/结束迭代器。然后,而不是打电话,说,

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

    我只能说

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

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

    【讨论】:

    • 我喜欢,我去看看 ASL
    【解决方案10】:

    我经常使用:

    • 升压::信号
    • boost::shared_ptr
    • boost::lexical_cast
    • boost::bind
    • 升压::随机
    • boost::thread
    • boost::noncopyable

    如果您正在编写一个将在各种平台上使用的库,则元组、静态断言和整数等其他函数非常有用。

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

    【讨论】:

    • 请为这些天的 C++11/14 更新(或考虑删除答案)。
    【解决方案11】:

    boost::shared_ptr 是现代 C++ 编程恕我直言的要求。这就是为什么他们将其添加到 TR1 的标准中。 boost::program_optionsboost::bindboost::signal 如果您知道它们的用途和使用方法,它们真的很棒。不过,最后两个往往会吓到新手。

    【讨论】:

      【解决方案12】:

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

      【讨论】:

        【解决方案13】:

        我很惊讶没有看到答案Boost.Thread

        【讨论】:

        • 现在有std::thread
        【解决方案14】:

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

        除此之外,我还将 Bind/Function/Lambda 用于通用回调机制——在测试时特别有用——以及用于我的通用 sprintf 替换的 Format。

        最后,就在前几天,我在愤怒中使用 Variant 来解决问题(一个可以用一小部分固定的不相关令牌类型响应的解析器)。解决方案非常优雅,我对此非常满意。


        几年过去了,时代变了,是时候更新了。 SharedPtr 和 Function 现在是标准的一部分,而 Bind 和 Lambda 已被实际的语言级 lambda 功能所淘汰。

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

        我使用的 Boost 的主要部分是 Boost.Asio。正在标准化的过程中。

        【讨论】:

        • 我同意以上所有观点——除了 Lambda。我用了一段时间,但它太曲折了,除了最简单的表达方式外,我已经放弃了它。热切期待 C++0x 及其 lambda 表达式。
        • 我同意 Boost.Lambda 充满了各种各样的陷阱——一旦我进入 Unlambda 或 Protect 领域,我就会放弃并按照旧的方式去做,但这似乎是必不可少的以任何体面的方式扩展回调。也就是说,我也在等待 C++0x 的实现。
        【解决方案15】:

        使用元组来迭代地图,像这样:

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

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

        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) { ... }
        

        【讨论】:

        【解决方案16】:

        你应该检查 boost::program_options。它使命令行解析变得更加容易。

        【讨论】:

          【解决方案17】:

          我使用 Boost 指针容器而不是 shared_ptrs 的 STL 容器。

          【讨论】:

            【解决方案18】:

            我经常使用boost::numeric::ublas::matrix

            【讨论】:

            • 我认为这是一个过时的库。
            【解决方案19】:

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

            【讨论】:

            • 智能指针是 RAII。
            • 更准确地说,当您别无选择只能动态分配内存时,智能指针会为您提供 RAII。
            【解决方案20】:

            好的,这是我发现的一个新的:
            除了使用 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】:

              这是我的两分钱:

              • boost::scope_exit - 无需为一次用途定义 RAII 类
              • boost::any
              • boost::variant
              • Boost 指针容器库 (ptr_vector)
              • Boost 池库
              • boost::unordered_map / boost::unordered_set

              【讨论】:

                【解决方案22】:

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

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

                boost::functionboost::bind 是绝对必须的。虽然现在它们是std::functionstd::bind。这些确实有助于减少不必要的代码量,并且通常对我的设计(或我的妄想)有好处。

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

                我会使用更多,但 Qt 有本地方式来做 Boost 所做的很多事情。如果我必须编写纯 C++ 程序,我想我会成为 boost::junkie :)

                【讨论】:

                  【解决方案23】:

                  我用得最多的东西现在都在 TR1 里了:

                  • 共享指针
                  • 数组类

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

                  您现在明白 Boost 旨在对大多数程序员有用,这就是为什么它是未来标准库的测试平台。

                  【讨论】:

                    【解决方案24】:

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

                    【讨论】:

                    • 例如:std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
                    • 如果您愿意放弃类型安全,您可以使用 vsnprintf()、省略号 (...)、va_list/stdarg.h 和本地(基于堆栈的)缓冲区自行开发.
                    • std::string 已经有 71 个函数太多了(根据 Herb Sutter 的计数,不是我的)。有关详细信息,请参阅gotw.ca/gotw/084.htm:我认为它有足够的信息来解释(a)为什么格式不需要在 std::string 中,以及(b)为什么编写通用算法比编写类成员函数更好。
                    • 或者换一种说法,“C++ 就像一个外国:他们在那里做的事情不同”;-)
                    • 格式不是库的一部分,因为 Stroustrup 在设计 C++ 时面临的挑战之一是构建类型安全的格式化 I/O 库。显然,结果就是您使用 iostreams 看到的结果。显然,当时没有人想到插值。也许有人想写一个格式流,让传统主义者有宾至如归的感觉?
                    【解决方案25】:

                    我认为问题应该反过来。你不想使用你的哪一部分?

                    根据我的经验,几乎所有这些在每个问题领域都很有趣和有用。

                    您应该花时间查看所有的 boost 文档,以找到您感兴趣的领域。

                    boost::numeric::ublas 可能是一个例外,它可以发挥作用,但 Eigen 做得更好。

                    【讨论】:

                    • 我怀疑 octonion 库是否被很多人使用。
                    猜你喜欢
                    • 2013-01-20
                    • 1970-01-01
                    • 2010-10-06
                    • 1970-01-01
                    • 2010-10-09
                    • 2014-12-30
                    • 1970-01-01
                    • 2011-10-27
                    • 1970-01-01
                    相关资源
                    最近更新 更多