std::to_string、boost::to_string和boost::lexical_cast<std::string>有什么区别?
What's the difference between std::to_string, boost::to_string, and boost::lexical_cast<std::string>?
boost::to_string
(在 boost/exception/to_string.hpp
中找到)的用途是什么?它与 boost::lexical_cast<std::string>
和 std::to_string
有何不同?
std::to_string
, available since C++11, works on fundamental numeric types specifically. It also has a std::to_wstring
变体。
它旨在产生与 sprintf
相同的结果。
您可以选择这种形式以避免依赖外部 libraries/headers。
失败时抛出函数 boost::lexical_cast<std::string>
and its non-throwing cousin boost::conversion::try_lexical_convert
适用于 可以插入 std::ostream
的任何类型,包括来自其他库或您的库的类型自己的代码。
常见类型存在优化的特化,泛型形式类似于:
template< typename OutType, typename InType >
OutType lexical_cast( const InType & input )
{
// Insert parameter to an iostream
std::stringstream temp_stream;
temp_stream << input;
// Extract output type from the same iostream
OutType output;
temp_stream >> output;
return output;
}
您可以选择这种形式来利用泛型函数中输入类型的更大灵活性,或者从您知道不是基本数字类型的类型生成 std::string
。
boost::to_string
没有直接记录,似乎主要供内部使用。它的功能表现得像 lexical_cast<std::string>
,而不是 std::to_string
。
还有更多区别:boost::lexical_cast 在将双精度转换为字符串时工作方式有点不同。请考虑以下代码:
#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 打印每个数字和小数点后六位。对于您的目的,一个可能比另一个更有用。我个人觉得 boost 版本更具可读性。
这是我找到的整数到字符串转换的基准,希望它对 float 和 double 的变化不大 Fast integer to string conversion benchmark in C++。
boost::to_string
(在 boost/exception/to_string.hpp
中找到)的用途是什么?它与 boost::lexical_cast<std::string>
和 std::to_string
有何不同?
std::to_string
, available since C++11, works on fundamental numeric types specifically. It also has a std::to_wstring
变体。
它旨在产生与 sprintf
相同的结果。
您可以选择这种形式以避免依赖外部 libraries/headers。
失败时抛出函数 boost::lexical_cast<std::string>
and its non-throwing cousin boost::conversion::try_lexical_convert
适用于 可以插入 std::ostream
的任何类型,包括来自其他库或您的库的类型自己的代码。
常见类型存在优化的特化,泛型形式类似于:
template< typename OutType, typename InType >
OutType lexical_cast( const InType & input )
{
// Insert parameter to an iostream
std::stringstream temp_stream;
temp_stream << input;
// Extract output type from the same iostream
OutType output;
temp_stream >> output;
return output;
}
您可以选择这种形式来利用泛型函数中输入类型的更大灵活性,或者从您知道不是基本数字类型的类型生成 std::string
。
boost::to_string
没有直接记录,似乎主要供内部使用。它的功能表现得像 lexical_cast<std::string>
,而不是 std::to_string
。
还有更多区别:boost::lexical_cast 在将双精度转换为字符串时工作方式有点不同。请考虑以下代码:
#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 打印每个数字和小数点后六位。对于您的目的,一个可能比另一个更有用。我个人觉得 boost 版本更具可读性。
这是我找到的整数到字符串转换的基准,希望它对 float 和 double 的变化不大 Fast integer to string conversion benchmark in C++。