Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between std::to_string, boost::to_string, and boost::lexical_cast<std::string>?

What's the purpose of boost::to_string (found in boost/exception/to_string.hpp) and how does it differ from boost::lexical_cast<std::string> and std::to_string?

like image 890
Claudiu Avatar asked Apr 01 '15 19:04

Claudiu


People also ask

What is boost :: Lexical_cast?

Boost. LexicalCast provides a cast operator, boost::lexical_cast , that can convert numbers from strings to numeric types like int or double and vice versa. boost::lexical_cast is an alternative to functions like std::stoi() , std::stod() , and std::to_string() , which were added to the standard library in C++11.

What is std :: To_string?

std::string to_string( long double value ); (9) (since C++11) Converts a numeric value to std::string. 1) Converts a signed integer to a string with the same content as what.

What does To_string mean in C++?

std::to_string Returns a string with the representation of val. The format used is the same that printf would print for the corresponding type: type of val.

Is std :: To_string slow?

std::to_string is no longer a performance disaster as it used to be, at least on integer input. It is still affected by the global locale giving unpredictable results and nondeterministic performance and should generally be avoided but its an interesting development nevertheless.


2 Answers

There are more differences: boost::lexical_cast works a bit different when converting double to string. Please consider the following code:

#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;
}

Results

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

As you can see, the boost version uses exponential notation (1.7976931348623157e+308) whereas std::to_string prints every digit, and six decimal places. One may be more useful than another for your purposes. I personally find the boost version more readable.

like image 35
Claus Klein Avatar answered Oct 03 '22 21:10

Claus Klein


std::to_string, available since C++11, works on fundamental numeric types specifically. It also has a std::to_wstring variant.

It is designed to produce the same results that sprintf would.

You may choose this form to avoid dependencies on external libraries/headers.


The throw-on-failure function boost::lexical_cast<std::string> and its non-throwing cousin boost::conversion::try_lexical_convert work on any type that can be inserted into a std::ostream, including types from other libraries or your own code.

Optimized specializations exist for common types, with the generic form resembling:

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;
}

You may choose this form to leverage greater flexibility of input types in generic functions, or to produce a std::string from a type that you know isn't a fundamental numeric type.


boost::to_string isn't directly documented, and seems to be for internal use primarily. Its functionality behaves like lexical_cast<std::string>, not std::to_string.

like image 131
Drew Dormann Avatar answered Oct 03 '22 21:10

Drew Dormann