std :: to_string,boost :: to_string和boost :: lexical_cast <std :: string>之间有什么区别?</std :: string>

时间:2015-04-01 19:20:31

标签: c++ boost std tostring lexical-cast

boost::to_string的目的是什么(在boost/exception/to_string.hpp中找到),它与boost::lexical_cast<std::string>std::to_string的区别如何?

3 个答案:

答案 0 :(得分:23)

std::to_string,自C ++ 11开始提供,专门用于基本数字类型。它还有一个std::to_wstring变体。

它旨在产生与sprintf相同的结果。

您可以选择此表单以避免依赖外部库/标题。


boost::lexical_cast<std::string>适用于可以插入std::ostream 的任何类型,包括其他库中的类型或您自己的代码。

对于常见类型存在优化的专业化,通用形式类似于:

template< typename OutType, typename InType >
OutType lexical_cast( const InType & input ) 
{
    std::stringstream temp_stream;
    temp_stream << input;

    OutType output;
    temp_stream >> output;
    return output;
}

您可以选择此表单以在通用函数中利用输入类型的更大灵活性,或者从您知道不是基本数字类型的类型中生成std::string


boost::to_string未直接记录,似乎主要供内部使用。其功能类似于lexical_cast<std::string>,而不是std::to_string

答案 1 :(得分:4)

还有更多不同之处:boost :: lexical_cast在将double转换为string时有点不同。请考虑以下代码:

#include <limits>
#include <iostream>

#include "boost/lexical_cast.hpp"

int main()
{
    double maxDouble = std::numeric_limits<double>::max();
    std::string str(std::to_string(maxDouble));

    std::cout << "std::to_string(" << maxDouble << ") == " << str << std::endl;
    std::cout << "boost::lexical_cast<std::string>(" << maxDouble << ") == "
              << boost::lexical_cast<std::string>(maxDouble) << std::endl;

    return 0;
}

结果

$ ./to_string
std::to_string(1.79769e+308) == 179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
boost::lexical_cast<std::string>(1.79769e+308) == 1.7976931348623157e+308

如您所见,boost版本使用指数表示法(1.7976931348623157e + 308),而std :: to_string打印每个数字和六个小数位。对于您的目的,一个可能比另一个更有用。我个人觉得提升版本更具可读性。

答案 2 :(得分:-2)

这是我发现的整数到字符串转换的基准,希望它对于float和double Fast integer to string conversion benchmark in C++不会有太大变化。