[library Boost.Lexical_Cast [quickbook 1.5] [version 1.0] [copyright 2000-2005 Kevlin Henney] [copyright 2006-2010 Alexander Nasonov] [copyright 2011-2012 Antony Polukhin] [category String and text processing] [category Miscellaneous] [license Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at [@http://www.boost.org/LICENSE_1_0.txt]) ] ] [def __numericcast__ [@boost:libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html `boost::numeric_cast`]] [def __proposallong__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1973.html Lexical Conversion Library Proposal for TR2, N1973 by Kevlin Henney and Beman Dawes]] [def __proposalshort__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1973.html Lexical Conversion Library Proposal for TR2, N1973]] [section Motivation] Sometimes a value must be converted to a literal text form, such as an [c++] `int` represented as a `std::string`, or vice-versa, when a `std::string` is interpreted as an `int`. Such examples are common when converting between data types internal to a program and representation external to a program, such as windows and configuration files. The standard C and C++ libraries offer a number of facilities for performing such conversions. However, they vary with their ease of use, extensibility, and safety. For instance, there are a number of limitations with the family of standard C functions typified by `atoi`: * Conversion is supported in one direction only: from text to internal data type. Converting the other way using the C library requires either the inconvenience and compromised safety of the `sprintf` function, or the loss of portability associated with non-standard functions such as `itoa`. * The range of types supported is only a subset of the built-in numeric types, namely `int`, `long`, and `double`. * The range of types cannot be extended in a uniform manner. For instance, conversion from string representation to complex or rational. The standard C functions typified by `strtol` have the same basic limitations, but offer finer control over the conversion process. However, for the common case such control is often either not required or not used. The `scanf` family of functions offer even greater control, but also lack safety and ease of use. The standard C++ library offers `stringstream` for the kind of in-core formatting being discussed. It offers a great deal of control over the formatting and conversion of I/O to and from arbitrary types through text. However, for simple conversions direct use of `stringstream` can be either clumsy (with the introduction of extra local variables and the loss of infix-expression convenience) or obscure (where `stringstream` objects are created as temporary objects in an expression). Facets provide a comprehensive concept and facility for controlling textual representation, but their perceived complexity and high entry level requires an extreme degree of involvement for simple conversions, and excludes all but a few programmers. The `lexical_cast` function template offers a convenient and consistent form for supporting common conversions to and from arbitrary types when they are represented as text. The simplification it offers is in expression-level convenience for such conversions. For more involved conversions, such as where precision or formatting need tighter control than is offered by the default behavior of `lexical_cast`, the conventional `std::stringstream` approach is recommended. Where the conversions are numeric to numeric, __numericcast__ may offer more reasonable behavior than `lexical_cast`. For a good discussion of the options and issues involved in string-based formatting, including comparison of `stringstream`, `lexical_cast`, and others, see Herb Sutter's article, [@http://www.gotw.ca/publications/mill19.htm The String Formatters of Manor Farm]. Also, take a look at the [link boost_lexical_cast.performance Performance] section. [endsect] [section Examples] The following example treats command line arguments as a sequence of numeric data: `` int main(int argc, char * argv[]) { using boost::lexical_cast; using boost::bad_lexical_cast; std::vector args; while(*++argv) { try { args.push_back(lexical_cast(*argv)); } catch(bad_lexical_cast &) { args.push_back(0); } } ... } `` The following example uses numeric data in a string expression: `` void log_message(const std::string &); void log_errno(int yoko) { log_message("Error " + boost::lexical_cast(yoko) + ": " + strerror(yoko)); } `` Following example converts some number and puts it to file: `` int i; FILE* file; ... typedef boost::array buf_t; // You can use std::array if your compiler supports it buf_t buffer = boost::lexical_cast(i); // No dynamic memory allocation puts(buffer.begin(), file); `` [endsect] [section Synopsis] Library features defined in [@boost:boost/lexical_cast.hpp boost/lexical_cast.hpp]: `` namespace boost { class bad_lexical_cast; template Target lexical_cast(const Source& arg); } `` [section lexical_cast] `` template Target lexical_cast(const Source& arg); `` Returns the result of streaming arg into a standard library string-based stream and then out as a Target object. Where Target is either `std::string` or `std::wstring`, stream extraction takes the whole content of the string, including spaces, rather than relying on the default `operator>>` behavior. If the conversion is unsuccessful, a `bad_lexical_cast` exception is thrown. The requirements on the argument and result types are: * Source is OutputStreamable, meaning that an `operator<<` is defined that takes a `std::ostream` or `std::wostream` object on the left hand side and an instance of the argument type on the right. * Target is InputStreamable, meaning that an `operator>>` is defined that takes a `std::istream` or `std::wistream` object on the left hand side and an instance of the result type on the right. * Target is CopyConstructible [20.1.3]. * Target is DefaultConstructible, meaning that it is possible to default-initialize an object of that type [8.5, 20.1.4]. The character type of the underlying stream is assumed to be `char` unless either the `Source` or the `Target` requires wide-character streaming, in which case the underlying stream uses `wchar_t`, `char16_t` or `char32_t`. Wide-character streaming is currently detected for: * Single character: `wchar_t`, `char16_t`, `char32_t` * Arrays of characters: `wchar_t *`, `char16_t *`, `char32_t *`, `const wchar_t *`, `const char16_t *`, `const char32_t *` * Strings: `std::basic_string`, `boost::containers::basic_string` * `boost::iterator_range`, where `WideCharPtr` is a pointer to wide-character or pointer to const wide-character * `boost::array` and `std::array`, `boost::array` and `std::array` [important Many compilers and runtime libraries fail to make conversions using new Unicode characters. Make sure that the following code compiles and outputs nonzero values, before using new types: `` std::cout << boost::lexical_cast(1.0).size() << " " << boost::lexical_cast(1.0).size(); `` ] Where a higher degree of control is required over conversions, `std::stringstream` and `std::wstringstream` offer a more appropriate path. Where non-stream-based conversions are required, `lexical_cast` is the wrong tool for the job and is not special-cased for such scenarios. [endsect] [section bad_lexical_cast] `` class bad_lexical_cast : public std::bad_cast { public: ... // same member function interface as std::exception }; `` Exception used to indicate runtime lexical_cast failure. [endsect] [endsect] [/ Commenting out bad advise (this will break the ability to get correct function pointers via &lexical_cast) [section Tuning classes for fast lexical conversions] Because of `boost::lexical_cast` optimizations for `boost::iterator_range`, it is possibile to make very fast lexical conversions for non zero terminated strings, substrings and user-defined classes. Consider the following example: `` class example_class { char non_zero_terminated_data[10]; std::size_t data_length; public: example_class(); void fill_data(); const char* data() const { return non_zero_terminated_data; } std::size_t size() const { return data_length; } }; inline std::ostream& operator << (std::ostream& ostr, const example_class& rhs) { return ostr << boost::make_iterator_range(rhs.data(), rhs.data() + rhs.size()); } `` This is a good generic solution for most use cases. But we can make it even faster for some performance critical applications. During conversion, we loose speed at: * `std::ostream` construction (it makes some heap allocations) * `operator <<` (it copyies one by one all the symbols to an instance of `std::ostream`) * `std::ostream` destruction (it makes some heap deallocations) We can avoid all of this, by specifieng an overload for `boost::lexical_cast`: `` namespace boost { template OutT lexical_cast(const example_class& rhs) { return boost::lexical_cast( boost::make_iterator_range(rhs.data(), rhs.data() + rhs.size()) ); } } `` Now `boost::lexical_cast(example_class_instance)` conversions won't copy data and construct heavy STL stream objects. See [link boost_lexical_cast.performance Performance] section for info on `boost::iterator_range` conversion performance. [endsect] ] [section Frequently Asked Questions] * [*Question:] Why does `lexical_cast("127")` throw `bad_lexical_cast`? * [*Answer:] The type `int8_t` is a `typedef` to `char` or `signed char`. Lexical conversion to these types is simply reading a byte from source but since the source has more than one byte, the exception is thrown. Please use other integer types such as `int` or `short int`. If bounds checking is important, you can also call __numericcast__: `numeric_cast(lexical_cast("127"));` [pre ] * [*Question:] Why does `lexical_cast("127")` throw `bad_lexical_cast`? * [*Answer:] Lexical conversion to any char type is simply reading a byte from source. But since the source has more than one byte, the exception is thrown. Please use other integer types such as `int` or `short int`. If bounds checking is important, you can also call __numericcast__: `numeric_cast(lexical_cast("127"));` [pre ] * [*Question:] What does `lexical_cast` of an `int8_t` or `uint8_t` not do what I expect? * [*Answer:] As above, note that int8_t and uint8_t are actually chars and are formatted as such. To avoid this, cast to an integer type first: `lexical_cast(static_cast(n));` [pre ] * [*Question:] The implementation always resets the `ios_base::skipws` flag of an underlying stream object. It breaks my `operator>>` that works only in presence of this flag. Can you remove code that resets the flag? * [*Answer:] May be in a future version. There is no requirement in __proposallong__ to reset the flag but remember that __proposalshort__ is not yet accepted by the committee. By the way, it's a great opportunity to make your `operator>>` conform to the standard. Read a good C++ book, study `std::sentry` and [@boost:libs/io/doc/ios_state.html `ios_state_saver`]. [pre ] * [*Question:] Why `std::cout << boost::lexical_cast("-1");` does not throw, but outputs 4294967295? * [*Answer:] `boost::lexical_cast` has the behavior of `std::stringstream`, which uses `num_get` functions of `std::locale` to convert numbers. If we look at the Programming languages — C++, we'll see, that `num_get` uses the rules of `scanf` for conversions. And in the C99 standard for unsigned input value minus sign is optional, so if a negative number is read, no errors will arise and the result will be the two's complement. [pre ] * [*Question:] Why `boost::lexical_cast(L'A');` outputs 65 and `boost::lexical_cast(L"65");` does not throw? * [*Answer:] If you are using an old version of Visual Studio or compile code with /Zc:wchar_t- flag, `boost::lexical_cast` sees single `wchar_t` character as `unsigned short`. It is not a `boost::lexical_cast` mistake, but a limitation of compiler options that you use. [pre ] * [*Question:] Why `boost::lexical_cast("-1.#IND");` throws `boost::bad_lexical_cast`? * [*Answer:] `"-1.#IND"` is a compiler extension, that violates standard. You shall input `"-nan"`, `"nan"`, `"inf"` , `"-inf"` (case insensitive) strings to get NaN and Inf values. `boost::lexical_cast` outputs `"-nan"`, `"nan"`, `"inf"`, `"-inf"` strings, when has NaN or Inf input values. [pre ] * [*Question:] What is the fastest way to convert a non zero terminated string or a substring using `boost::lexical_cast`? * [*Answer:] Use `boost::iterator_range` for conversion. For example, if you whant to convert to `int` two characters from a string `str`, you shall write `lexacal_cast(make_iterator_range(str.c_str(), str.c_str() + 2));`. [endsect] [section Changes] * [*boost 1.51.0 :] * Better performance, less memory usage for `boost::array` and `std::array` conversions. * [*boost 1.50.0 :] * `boost::bad_lexical_cast` exception is now globaly visible and can be catched even if code is compiled with -fvisibility=hidden. * Now it is possible to compile library with disabled exceptions. * Better performance, less memory usage and bugfixes for `boost::iterator_range` conversions. * [*boost 1.49.0 :] * Restored work with typedefed wchar_t (compilation flag /Zc:wchar_t- for Visual Studio). * Better performance and less memory usage for `boost::container::basic_string` conversions. * [*boost 1.48.0 :] * Added code to work with Inf and NaN on any platform. * Better performance and less memory usage for conversions to float type (and to double type, if `sizeof(double) < sizeof(long double)`). * [*boost 1.47.0 :] * Optimizations for "C" and other locales without number grouping. * Better performance and less memory usage for unsigned char and signed char conversions. * Better performance and less memory usage for conversions to arithmetic types. * Better performance and less memory usage for conversions from arithmetic type to arithmetic type. * Directly construct Target from Source on some conversions (like conversions from string to string, from char array to string, from char to char and others). * [*boost 1.34.0 :] * Better performance for many combinations of Source and Target types. For more details refer to Alexander Nasonovs article [@http://accu.org/index.php/journals/1375 Fine Tuning for lexical_cast, Overload #74, August 2006] [@http://www.accu.org/var/uploads/journals/overload74.pdf (PDF)]. * [*boost 1.33.0 :] * Call-by-const reference for the parameters. This requires partial specialization of class templates, so it doesn't work for MSVC 6, and it uses the original pass by value there. * The MSVC 6 support is deprecated, and will be removed in a future Boost version. * [*Earlier :] * The previous version of lexical_cast used the default stream precision for reading and writing floating-point numbers. For numerics that have a corresponding specialization of `std::numeric_limits`, the current version now chooses a precision to match. * The previous version of lexical_cast did not support conversion to or from any wide-character-based types. For compilers with full language and library support for wide characters, `lexical_cast` now supports conversions from `wchar_t`, `wchar_t *`, and `std::wstring` and to `wchar_t` and `std::wstring`. * The previous version of `lexical_cast` assumed that the conventional stream extractor operators were sufficient for reading values. However, string I/O is asymmetric, with the result that spaces play the role of I/O separators rather than string content. The current version fixes this error for `std::string` and, where supported, `std::wstring`: `lexical_cast("Hello, World")` succeeds instead of failing with a `bad_lexical_cast` exception. * The previous version of `lexical_cast` allowed unsafe and meaningless conversions to pointers. The current version now throws a `bad_lexical_cast` for conversions to pointers: `lexical_cast("Goodbye, World")` now throws an exception instead of causing undefined behavior. [endsect] [section Performance] In most cases `boost::lexical_cast` is faster than `scanf`, `printf`, `std::stringstream`. For more detailed info you can look at the tables below. [section Tests description] All the tests measure execution speed in milliseconds for 10000 iterations of the following code blocks: [table:legend Tests source code [[Test name] [Code]] [[lexical_cast] [`` _out = boost::lexical_cast(_in); ``] ] [[std::stringstream with construction] [`` std::stringstream ss; ss << _in; if (ss.fail()) throw std::logic_error(descr); ss >> _out; if (ss.fail()) throw std::logic_error(descr); ``] ] [[std::stringstream without construction] [`` ss << _in; // ss is an instance of std::stringstream if (ss.fail()) throw std::logic_error(descr); ss >> _out; if (ss.fail()) throw std::logic_error(descr); /* reseting std::stringstream to use it again */ ss.str(std::string()); ss.clear(); ``] ] [[scanf/printf] [`` typename OUTTYPE::value_type buffer[500]; sprintf( (char*)buffer, conv, _in); _out = buffer; ``] ] ] Fastest results are highlitened with "!!! *x* !!!". Do not use this results to compare compilers, because tests were taken on different hardware. [endsect] [/ BEGIN of section, generated by performance measuring program ] [section Clang version 3.0 (tags/RELEASE_30/final)] [table:id Performance Table ( Clang version 3.0 (tags/RELEASE_30/final)) [[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]] [[ string->char ][ !!! *<1* !!! ][ 169 ][ 9 ][ 10 ]] [[ string->signed char ][ !!! *<1* !!! ][ 108 ][ 8 ][ 10 ]] [[ string->unsigned char ][ !!! *<1* !!! ][ 103 ][ 9 ][ 10 ]] [[ string->int ][ !!! *6* !!! ][ 117 ][ 24 ][ 24 ]] [[ string->short ][ !!! *7* !!! ][ 115 ][ 20 ][ 24 ]] [[ string->long int ][ !!! *7* !!! ][ 115 ][ 19 ][ 22 ]] [[ string->long long ][ !!! *8* !!! ][ 116 ][ 21 ][ 23 ]] [[ string->unsigned int ][ !!! *6* !!! ][ 121 ][ 18 ][ 23 ]] [[ string->unsigned short ][ !!! *6* !!! ][ 116 ][ 19 ][ 22 ]] [[ string->unsigned long int ][ !!! *7* !!! ][ 117 ][ 23 ][ 21 ]] [[ string->unsigned long long ][ !!! *8* !!! ][ 118 ][ 19 ][ 34 ]] [[ string->float ][ !!! *13* !!! ][ 201 ][ 55 ][ 41 ]] [[ string->double ][ !!! *14* !!! ][ 151 ][ 54 ][ 41 ]] [[ string->long double ][ 195 ][ 231 ][ 67 ][ !!! *42* !!! ]] [[ string->array ][ !!! *<1* !!! ][ 121 ][ 18 ][ 12 ]] [[ string->string ][ !!! *1* !!! ][ 124 ][ 27 ][ --- ]] [[ string->container::string ][ !!! *3* !!! ][ 114 ][ 25 ][ --- ]] [[ string->char ][ 7 ][ 111 ][ 25 ][ !!! *7* !!! ]] [[ string->signed char ][ !!! *6* !!! ][ 112 ][ 30 ][ 26 ]] [[ string->unsigned char ][ !!! *6* !!! ][ 113 ][ 25 ][ 24 ]] [[ int->string ][ !!! *12* !!! ][ 126 ][ 36 ][ 21 ]] [[ short->string ][ !!! *11* !!! ][ 135 ][ 30 ][ 21 ]] [[ long int->string ][ !!! *11* !!! ][ 128 ][ 28 ][ 21 ]] [[ long long->string ][ !!! *12* !!! ][ 126 ][ 32 ][ 24 ]] [[ unsigned int->string ][ !!! *11* !!! ][ 131 ][ 36 ][ 22 ]] [[ unsigned short->string ][ !!! *11* !!! ][ 130 ][ 28 ][ 22 ]] [[ unsigned long int->string ][ !!! *11* !!! ][ 130 ][ 36 ][ 22 ]] [[ unsigned long long->string ][ !!! *11* !!! ][ 127 ][ 43 ][ 25 ]] [[ float->string ][ 53 ][ 190 ][ 83 ][ !!! *41* !!! ]] [[ double->string ][ 59 ][ 197 ][ 82 ][ !!! *44* !!! ]] [[ long double->string ][ 118 ][ 229 ][ 101 ][ !!! *44* !!! ]] [[ char*->char ][ !!! *1* !!! ][ 105 ][ 9 ][ 9 ]] [[ char*->signed char ][ !!! *1* !!! ][ 107 ][ 10 ][ 10 ]] [[ char*->unsigned char ][ !!! *1* !!! ][ 106 ][ 9 ][ 11 ]] [[ char*->int ][ !!! *7* !!! ][ 149 ][ 25 ][ 24 ]] [[ char*->short ][ !!! *7* !!! ][ 118 ][ 20 ][ 22 ]] [[ char*->long int ][ !!! *9* !!! ][ 117 ][ 20 ][ 28 ]] [[ char*->long long ][ !!! *9* !!! ][ 128 ][ 23 ][ 29 ]] [[ char*->unsigned int ][ !!! *7* !!! ][ 120 ][ 19 ][ 23 ]] [[ char*->unsigned short ][ !!! *7* !!! ][ 125 ][ 20 ][ 22 ]] [[ char*->unsigned long int ][ !!! *8* !!! ][ 125 ][ 21 ][ 24 ]] [[ char*->unsigned long long ][ !!! *8* !!! ][ 130 ][ 19 ][ 22 ]] [[ char*->float ][ !!! *14* !!! ][ 162 ][ 56 ][ 41 ]] [[ char*->double ][ !!! *16* !!! ][ 151 ][ 54 ][ 39 ]] [[ char*->long double ][ 111 ][ 176 ][ 58 ][ !!! *42* !!! ]] [[ char*->array ][ !!! *1* !!! ][ 116 ][ 20 ][ 17 ]] [[ char*->string ][ !!! *8* !!! ][ 125 ][ 27 ][ --- ]] [[ char*->container::string ][ !!! *2* !!! ][ 115 ][ 26 ][ --- ]] [[ unsigned char*->char ][ !!! *1* !!! ][ 101 ][ 9 ][ 9 ]] [[ unsigned char*->signed char ][ !!! *1* !!! ][ 104 ][ 9 ][ 11 ]] [[ unsigned char*->unsigned char ][ !!! *1* !!! ][ 103 ][ 9 ][ 13 ]] [[ unsigned char*->int ][ !!! *8* !!! ][ 116 ][ 20 ][ 24 ]] [[ unsigned char*->short ][ !!! *7* !!! ][ 121 ][ 20 ][ 26 ]] [[ unsigned char*->long int ][ !!! *8* !!! ][ 118 ][ 20 ][ 22 ]] [[ unsigned char*->long long ][ !!! *8* !!! ][ 122 ][ 20 ][ 23 ]] [[ unsigned char*->unsigned int ][ !!! *6* !!! ][ 119 ][ 22 ][ 23 ]] [[ unsigned char*->unsigned short ][ !!! *7* !!! ][ 122 ][ 20 ][ 22 ]] [[ unsigned char*->unsigned long int ][ !!! *8* !!! ][ 125 ][ 21 ][ 22 ]] [[ unsigned char*->unsigned long long ][ !!! *8* !!! ][ 122 ][ 19 ][ 25 ]] [[ unsigned char*->float ][ !!! *14* !!! ][ 162 ][ 62 ][ 37 ]] [[ unsigned char*->double ][ !!! *15* !!! ][ 151 ][ 58 ][ 39 ]] [[ unsigned char*->long double ][ 116 ][ 156 ][ 58 ][ !!! *42* !!! ]] [[ unsigned char*->array ][ !!! *1* !!! ][ 122 ][ 19 ][ 15 ]] [[ unsigned char*->string ][ !!! *8* !!! ][ 124 ][ 27 ][ --- ]] [[ unsigned char*->container::string ][ !!! *4* !!! ][ 119 ][ 25 ][ --- ]] [[ signed char*->char ][ !!! *1* !!! ][ 107 ][ 9 ][ 9 ]] [[ signed char*->signed char ][ !!! *1* !!! ][ 108 ][ 10 ][ 11 ]] [[ signed char*->unsigned char ][ !!! *1* !!! ][ 106 ][ 9 ][ 11 ]] [[ signed char*->int ][ !!! *7* !!! ][ 122 ][ 21 ][ 22 ]] [[ signed char*->short ][ !!! *7* !!! ][ 126 ][ 20 ][ 22 ]] [[ signed char*->long int ][ !!! *8* !!! ][ 119 ][ 20 ][ 23 ]] [[ signed char*->long long ][ !!! *8* !!! ][ 119 ][ 21 ][ 26 ]] [[ signed char*->unsigned int ][ !!! *6* !!! ][ 124 ][ 18 ][ 22 ]] [[ signed char*->unsigned short ][ !!! *7* !!! ][ 124 ][ 21 ][ 23 ]] [[ signed char*->unsigned long int ][ !!! *8* !!! ][ 121 ][ 24 ][ 23 ]] [[ signed char*->unsigned long long ][ !!! *8* !!! ][ 122 ][ 20 ][ 22 ]] [[ signed char*->float ][ !!! *14* !!! ][ 167 ][ 56 ][ 37 ]] [[ signed char*->double ][ !!! *14* !!! ][ 162 ][ 53 ][ 40 ]] [[ signed char*->long double ][ 110 ][ 152 ][ 56 ][ !!! *42* !!! ]] [[ signed char*->array ][ !!! *1* !!! ][ 117 ][ 19 ][ 12 ]] [[ signed char*->string ][ !!! *8* !!! ][ 132 ][ 27 ][ --- ]] [[ signed char*->container::string ][ !!! *4* !!! ][ 116 ][ 26 ][ --- ]] [[ iterator_range->char ][ !!! *<1* !!! ][ 112 ][ 14 ][ 9 ]] [[ iterator_range->signed char ][ !!! *<1* !!! ][ 107 ][ 13 ][ 10 ]] [[ iterator_range->unsigned char ][ !!! *<1* !!! ][ 145 ][ 15 ][ 10 ]] [[ iterator_range->int ][ !!! *6* !!! ][ 119 ][ 22 ][ 23 ]] [[ iterator_range->short ][ !!! *6* !!! ][ 115 ][ 22 ][ 23 ]] [[ iterator_range->long int ][ !!! *7* !!! ][ 115 ][ 25 ][ 22 ]] [[ iterator_range->long long ][ !!! *7* !!! ][ 117 ][ 21 ][ 23 ]] [[ iterator_range->unsigned int ][ !!! *6* !!! ][ 118 ][ 22 ][ 22 ]] [[ iterator_range->unsigned short ][ !!! *6* !!! ][ 117 ][ 24 ][ 22 ]] [[ iterator_range->unsigned long int ][ !!! *7* !!! ][ 124 ][ 25 ][ 22 ]] [[ iterator_range->unsigned long long ][ !!! *7* !!! ][ 119 ][ 22 ][ 22 ]] [[ iterator_range->float ][ !!! *13* !!! ][ 159 ][ 42 ][ 41 ]] [[ iterator_range->double ][ !!! *14* !!! ][ 152 ][ 40 ][ 40 ]] [[ iterator_range->long double ][ 113 ][ 155 ][ 58 ][ !!! *54* !!! ]] [[ iterator_range->array ][ !!! *<1* !!! ][ 127 ][ 23 ][ 13 ]] [[ iterator_range->string ][ !!! *7* !!! ][ 132 ][ 30 ][ --- ]] [[ iterator_range->container::string ][ !!! *3* !!! ][ 122 ][ 24 ][ --- ]] [[ array->char ][ !!! *<1* !!! ][ 110 ][ 9 ][ 10 ]] [[ array->signed char ][ !!! *<1* !!! ][ 119 ][ 9 ][ 13 ]] [[ array->unsigned char ][ !!! *<1* !!! ][ 106 ][ 13 ][ 11 ]] [[ array->int ][ !!! *6* !!! ][ 131 ][ 21 ][ 22 ]] [[ array->short ][ !!! *7* !!! ][ 119 ][ 22 ][ 28 ]] [[ array->long int ][ !!! *8* !!! ][ 133 ][ 21 ][ 26 ]] [[ array->long long ][ !!! *8* !!! ][ 115 ][ 22 ][ 23 ]] [[ array->unsigned int ][ !!! *6* !!! ][ 118 ][ 18 ][ 22 ]] [[ array->unsigned short ][ !!! *7* !!! ][ 119 ][ 19 ][ 22 ]] [[ array->unsigned long int ][ !!! *7* !!! ][ 118 ][ 23 ][ 21 ]] [[ array->unsigned long long ][ !!! *7* !!! ][ 117 ][ 20 ][ 22 ]] [[ array->float ][ !!! *15* !!! ][ 156 ][ 53 ][ 36 ]] [[ array->double ][ !!! *15* !!! ][ 148 ][ 55 ][ 39 ]] [[ array->long double ][ 110 ][ 150 ][ 56 ][ !!! *41* !!! ]] [[ array->array ][ !!! *<1* !!! ][ 117 ][ 19 ][ 12 ]] [[ array->string ][ !!! *7* !!! ][ 124 ][ 26 ][ --- ]] [[ array->container::string ][ !!! *4* !!! ][ 115 ][ 26 ][ --- ]] [[ int->int ][ !!! *<1* !!! ][ 117 ][ 24 ][ --- ]] [[ float->double ][ !!! *<1* !!! ][ 245 ][ 125 ][ --- ]] [[ char->signed char ][ !!! *<1* !!! ][ 100 ][ 9 ][ --- ]] ] [endsect] [section GNU C++ version 4.6.3] [table:id Performance Table ( GNU C++ version 4.6.3) [[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]] [[ string->char ][ !!! *<1* !!! ][ 142 ][ 10 ][ 18 ]] [[ string->signed char ][ !!! *<1* !!! ][ 111 ][ 8 ][ 10 ]] [[ string->unsigned char ][ !!! *<1* !!! ][ 101 ][ 8 ][ 10 ]] [[ string->int ][ !!! *7* !!! ][ 110 ][ 20 ][ 24 ]] [[ string->short ][ !!! *6* !!! ][ 109 ][ 20 ][ 25 ]] [[ string->long int ][ !!! *7* !!! ][ 113 ][ 19 ][ 24 ]] [[ string->long long ][ !!! *7* !!! ][ 116 ][ 24 ][ 23 ]] [[ string->unsigned int ][ !!! *6* !!! ][ 110 ][ 19 ][ 23 ]] [[ string->unsigned short ][ !!! *5* !!! ][ 116 ][ 18 ][ 23 ]] [[ string->unsigned long int ][ !!! *7* !!! ][ 111 ][ 22 ][ 23 ]] [[ string->unsigned long long ][ !!! *7* !!! ][ 108 ][ 20 ][ 22 ]] [[ string->float ][ !!! *11* !!! ][ 161 ][ 54 ][ 38 ]] [[ string->double ][ !!! *11* !!! ][ 146 ][ 56 ][ 41 ]] [[ string->long double ][ 113 ][ 151 ][ 59 ][ !!! *43* !!! ]] [[ string->array ][ !!! *<1* !!! ][ 107 ][ 18 ][ 14 ]] [[ string->string ][ !!! *2* !!! ][ 127 ][ 24 ][ --- ]] [[ string->container::string ][ !!! *3* !!! ][ 142 ][ 26 ][ --- ]] [[ string->char ][ !!! *7* !!! ][ 110 ][ 23 ][ 17 ]] [[ string->signed char ][ !!! *7* !!! ][ 114 ][ 23 ][ 24 ]] [[ string->unsigned char ][ !!! *7* !!! ][ 110 ][ 25 ][ 24 ]] [[ int->string ][ !!! *12* !!! ][ 127 ][ 31 ][ 22 ]] [[ short->string ][ !!! *13* !!! ][ 129 ][ 31 ][ 22 ]] [[ long int->string ][ !!! *12* !!! ][ 125 ][ 30 ][ 22 ]] [[ long long->string ][ !!! *13* !!! ][ 127 ][ 34 ][ 24 ]] [[ unsigned int->string ][ !!! *13* !!! ][ 127 ][ 27 ][ 21 ]] [[ unsigned short->string ][ !!! *12* !!! ][ 127 ][ 28 ][ 22 ]] [[ unsigned long int->string ][ !!! *12* !!! ][ 131 ][ 27 ][ 22 ]] [[ unsigned long long->string ][ !!! *12* !!! ][ 125 ][ 28 ][ 24 ]] [[ float->string ][ 51 ][ 200 ][ 81 ][ !!! *40* !!! ]] [[ double->string ][ 56 ][ 194 ][ 82 ][ !!! *48* !!! ]] [[ long double->string ][ 65 ][ 220 ][ 82 ][ !!! *41* !!! ]] [[ char*->char ][ !!! *<1* !!! ][ 104 ][ 10 ][ 9 ]] [[ char*->signed char ][ !!! *<1* !!! ][ 101 ][ 10 ][ 11 ]] [[ char*->unsigned char ][ !!! *<1* !!! ][ 99 ][ 10 ][ 12 ]] [[ char*->int ][ !!! *6* !!! ][ 112 ][ 23 ][ 24 ]] [[ char*->short ][ !!! *6* !!! ][ 115 ][ 21 ][ 23 ]] [[ char*->long int ][ !!! *8* !!! ][ 111 ][ 21 ][ 24 ]] [[ char*->long long ][ !!! *9* !!! ][ 112 ][ 21 ][ 30 ]] [[ char*->unsigned int ][ !!! *7* !!! ][ 112 ][ 22 ][ 24 ]] [[ char*->unsigned short ][ !!! *6* !!! ][ 119 ][ 19 ][ 23 ]] [[ char*->unsigned long int ][ !!! *7* !!! ][ 115 ][ 22 ][ 23 ]] [[ char*->unsigned long long ][ !!! *7* !!! ][ 115 ][ 20 ][ 23 ]] [[ char*->float ][ !!! *12* !!! ][ 153 ][ 54 ][ 39 ]] [[ char*->double ][ !!! *12* !!! ][ 153 ][ 61 ][ 41 ]] [[ char*->long double ][ 108 ][ 160 ][ 61 ][ !!! *49* !!! ]] [[ char*->array ][ !!! *<1* !!! ][ 107 ][ 20 ][ 14 ]] [[ char*->string ][ !!! *7* !!! ][ 123 ][ 26 ][ --- ]] [[ char*->container::string ][ !!! *2* !!! ][ 121 ][ 24 ][ --- ]] [[ unsigned char*->char ][ !!! *<1* !!! ][ 97 ][ 10 ][ 9 ]] [[ unsigned char*->signed char ][ !!! *<1* !!! ][ 98 ][ 10 ][ 12 ]] [[ unsigned char*->unsigned char ][ !!! *<1* !!! ][ 99 ][ 11 ][ 12 ]] [[ unsigned char*->int ][ !!! *6* !!! ][ 112 ][ 22 ][ 24 ]] [[ unsigned char*->short ][ !!! *10* !!! ][ 111 ][ 24 ][ 24 ]] [[ unsigned char*->long int ][ !!! *8* !!! ][ 110 ][ 23 ][ 24 ]] [[ unsigned char*->long long ][ !!! *9* !!! ][ 115 ][ 21 ][ 25 ]] [[ unsigned char*->unsigned int ][ !!! *6* !!! ][ 111 ][ 24 ][ 23 ]] [[ unsigned char*->unsigned short ][ !!! *6* !!! ][ 118 ][ 19 ][ 23 ]] [[ unsigned char*->unsigned long int ][ !!! *8* !!! ][ 112 ][ 21 ][ 23 ]] [[ unsigned char*->unsigned long long ][ !!! *13* !!! ][ 109 ][ 20 ][ 23 ]] [[ unsigned char*->float ][ !!! *12* !!! ][ 154 ][ 56 ][ 39 ]] [[ unsigned char*->double ][ !!! *17* !!! ][ 150 ][ 58 ][ 41 ]] [[ unsigned char*->long double ][ 108 ][ 149 ][ 68 ][ !!! *43* !!! ]] [[ unsigned char*->array ][ !!! *1* !!! ][ 107 ][ 19 ][ 15 ]] [[ unsigned char*->string ][ !!! *8* !!! ][ 124 ][ 26 ][ --- ]] [[ unsigned char*->container::string ][ !!! *4* !!! ][ 121 ][ 24 ][ --- ]] [[ signed char*->char ][ !!! *<1* !!! ][ 99 ][ 10 ][ 9 ]] [[ signed char*->signed char ][ !!! *<1* !!! ][ 99 ][ 10 ][ 10 ]] [[ signed char*->unsigned char ][ !!! *<1* !!! ][ 99 ][ 10 ][ 12 ]] [[ signed char*->int ][ !!! *6* !!! ][ 113 ][ 28 ][ 24 ]] [[ signed char*->short ][ !!! *6* !!! ][ 110 ][ 21 ][ 25 ]] [[ signed char*->long int ][ !!! *8* !!! ][ 110 ][ 21 ][ 24 ]] [[ signed char*->long long ][ !!! *9* !!! ][ 116 ][ 21 ][ 24 ]] [[ signed char*->unsigned int ][ !!! *7* !!! ][ 114 ][ 21 ][ 23 ]] [[ signed char*->unsigned short ][ !!! *6* !!! ][ 116 ][ 20 ][ 23 ]] [[ signed char*->unsigned long int ][ !!! *8* !!! ][ 113 ][ 27 ][ 23 ]] [[ signed char*->unsigned long long ][ !!! *8* !!! ][ 110 ][ 20 ][ 23 ]] [[ signed char*->float ][ !!! *12* !!! ][ 155 ][ 53 ][ 44 ]] [[ signed char*->double ][ !!! *13* !!! ][ 150 ][ 60 ][ 42 ]] [[ signed char*->long double ][ 108 ][ 151 ][ 62 ][ !!! *44* !!! ]] [[ signed char*->array ][ !!! *1* !!! ][ 107 ][ 19 ][ 15 ]] [[ signed char*->string ][ !!! *8* !!! ][ 124 ][ 26 ][ --- ]] [[ signed char*->container::string ][ !!! *4* !!! ][ 121 ][ 24 ][ --- ]] [[ iterator_range->char ][ !!! *<1* !!! ][ 103 ][ 14 ][ 10 ]] [[ iterator_range->signed char ][ !!! *<1* !!! ][ 102 ][ 15 ][ 12 ]] [[ iterator_range->unsigned char ][ !!! *<1* !!! ][ 102 ][ 14 ][ 12 ]] [[ iterator_range->int ][ !!! *6* !!! ][ 115 ][ 23 ][ 24 ]] [[ iterator_range->short ][ !!! *5* !!! ][ 110 ][ 22 ][ 24 ]] [[ iterator_range->long int ][ !!! *7* !!! ][ 109 ][ 22 ][ 29 ]] [[ iterator_range->long long ][ !!! *7* !!! ][ 111 ][ 24 ][ 28 ]] [[ iterator_range->unsigned int ][ !!! *6* !!! ][ 114 ][ 22 ][ 23 ]] [[ iterator_range->unsigned short ][ !!! *5* !!! ][ 115 ][ 20 ][ 22 ]] [[ iterator_range->unsigned long int ][ !!! *7* !!! ][ 123 ][ 26 ][ 23 ]] [[ iterator_range->unsigned long long ][ !!! *7* !!! ][ 110 ][ 23 ][ 24 ]] [[ iterator_range->float ][ !!! *11* !!! ][ 153 ][ 38 ][ 38 ]] [[ iterator_range->double ][ !!! *11* !!! ][ 140 ][ 43 ][ 40 ]] [[ iterator_range->long double ][ 108 ][ 147 ][ !!! *41* !!! ][ 46 ]] [[ iterator_range->array ][ !!! *<1* !!! ][ 109 ][ 22 ][ 15 ]] [[ iterator_range->string ][ !!! *8* !!! ][ 122 ][ 29 ][ --- ]] [[ iterator_range->container::string ][ !!! *3* !!! ][ 117 ][ 23 ][ --- ]] [[ array->char ][ !!! *<1* !!! ][ 98 ][ 10 ][ 9 ]] [[ array->signed char ][ !!! *<1* !!! ][ 99 ][ 9 ][ 12 ]] [[ array->unsigned char ][ !!! *<1* !!! ][ 102 ][ 9 ][ 12 ]] [[ array->int ][ !!! *6* !!! ][ 119 ][ 23 ][ 23 ]] [[ array->short ][ !!! *6* !!! ][ 111 ][ 21 ][ 26 ]] [[ array->long int ][ !!! *7* !!! ][ 115 ][ 20 ][ 28 ]] [[ array->long long ][ !!! *9* !!! ][ 110 ][ 21 ][ 26 ]] [[ array->unsigned int ][ !!! *6* !!! ][ 115 ][ 22 ][ 23 ]] [[ array->unsigned short ][ !!! *6* !!! ][ 115 ][ 19 ][ 23 ]] [[ array->unsigned long int ][ !!! *7* !!! ][ 118 ][ 23 ][ 23 ]] [[ array->unsigned long long ][ !!! *7* !!! ][ 109 ][ 20 ][ 24 ]] [[ array->float ][ !!! *12* !!! ][ 160 ][ 53 ][ 38 ]] [[ array->double ][ !!! *11* !!! ][ 147 ][ 57 ][ 41 ]] [[ array->long double ][ 109 ][ 154 ][ 59 ][ !!! *42* !!! ]] [[ array->array ][ !!! *1* !!! ][ 105 ][ 19 ][ 14 ]] [[ array->string ][ !!! *8* !!! ][ 129 ][ 26 ][ --- ]] [[ array->container::string ][ !!! *4* !!! ][ 116 ][ 25 ][ --- ]] [[ int->int ][ !!! *<1* !!! ][ 118 ][ 24 ][ --- ]] [[ float->double ][ !!! *<1* !!! ][ 242 ][ 132 ][ --- ]] [[ char->signed char ][ !!! *<1* !!! ][ 94 ][ 8 ][ --- ]] ] [endsect] [section GNU C++ version 4.5.3] [table:id Performance Table ( GNU C++ version 4.5.3) [[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]] [[ string->char ][ !!! *<1* !!! ][ 153 ][ 15 ][ 9 ]] [[ string->signed char ][ !!! *<1* !!! ][ 134 ][ 8 ][ 10 ]] [[ string->unsigned char ][ !!! *<1* !!! ][ 97 ][ 8 ][ 14 ]] [[ string->int ][ !!! *7* !!! ][ 115 ][ 22 ][ 22 ]] [[ string->short ][ !!! *5* !!! ][ 112 ][ 19 ][ 21 ]] [[ string->long int ][ !!! *7* !!! ][ 110 ][ 19 ][ 24 ]] [[ string->long long ][ !!! *7* !!! ][ 115 ][ 21 ][ 23 ]] [[ string->unsigned int ][ !!! *6* !!! ][ 113 ][ 20 ][ 23 ]] [[ string->unsigned short ][ !!! *5* !!! ][ 116 ][ 18 ][ 23 ]] [[ string->unsigned long int ][ !!! *7* !!! ][ 111 ][ 20 ][ 23 ]] [[ string->unsigned long long ][ !!! *7* !!! ][ 115 ][ 18 ][ 23 ]] [[ string->float ][ !!! *14* !!! ][ 153 ][ 55 ][ 38 ]] [[ string->double ][ !!! *11* !!! ][ 151 ][ 60 ][ 38 ]] [[ string->long double ][ 107 ][ 151 ][ 59 ][ !!! *44* !!! ]] [[ string->array ][ !!! *<1* !!! ][ 107 ][ 18 ][ 12 ]] [[ string->string ][ !!! *2* !!! ][ 129 ][ 49 ][ --- ]] [[ string->container::string ][ !!! *9* !!! ][ 199 ][ 22 ][ --- ]] [[ string->char ][ !!! *7* !!! ][ 114 ][ 27 ][ 16 ]] [[ string->signed char ][ !!! *7* !!! ][ 116 ][ 32 ][ 23 ]] [[ string->unsigned char ][ !!! *7* !!! ][ 114 ][ 27 ][ 22 ]] [[ int->string ][ !!! *11* !!! ][ 125 ][ 31 ][ 21 ]] [[ short->string ][ !!! *11* !!! ][ 126 ][ 33 ][ 21 ]] [[ long int->string ][ !!! *11* !!! ][ 126 ][ 32 ][ 22 ]] [[ long long->string ][ !!! *11* !!! ][ 118 ][ 30 ][ 23 ]] [[ unsigned int->string ][ !!! *11* !!! ][ 125 ][ 31 ][ 20 ]] [[ unsigned short->string ][ !!! *12* !!! ][ 128 ][ 30 ][ 21 ]] [[ unsigned long int->string ][ !!! *11* !!! ][ 131 ][ 30 ][ 21 ]] [[ unsigned long long->string ][ !!! *11* !!! ][ 127 ][ 32 ][ 23 ]] [[ float->string ][ 49 ][ 197 ][ 92 ][ !!! *39* !!! ]] [[ double->string ][ 56 ][ 195 ][ 80 ][ !!! *43* !!! ]] [[ long double->string ][ 60 ][ 222 ][ 88 ][ !!! *42* !!! ]] [[ char*->char ][ !!! *<1* !!! ][ 100 ][ 10 ][ 9 ]] [[ char*->signed char ][ !!! *<1* !!! ][ 99 ][ 10 ][ 10 ]] [[ char*->unsigned char ][ !!! *<1* !!! ][ 106 ][ 10 ][ 10 ]] [[ char*->int ][ !!! *7* !!! ][ 113 ][ 23 ][ 22 ]] [[ char*->short ][ !!! *6* !!! ][ 113 ][ 21 ][ 23 ]] [[ char*->long int ][ !!! *8* !!! ][ 116 ][ 21 ][ 23 ]] [[ char*->long long ][ !!! *8* !!! ][ 115 ][ 21 ][ 21 ]] [[ char*->unsigned int ][ !!! *6* !!! ][ 114 ][ 25 ][ 22 ]] [[ char*->unsigned short ][ !!! *6* !!! ][ 119 ][ 20 ][ 23 ]] [[ char*->unsigned long int ][ !!! *8* !!! ][ 114 ][ 23 ][ 23 ]] [[ char*->unsigned long long ][ !!! *7* !!! ][ 111 ][ 20 ][ 24 ]] [[ char*->float ][ !!! *16* !!! ][ 154 ][ 54 ][ 38 ]] [[ char*->double ][ !!! *12* !!! ][ 149 ][ 59 ][ 40 ]] [[ char*->long double ][ 107 ][ 166 ][ 62 ][ !!! *44* !!! ]] [[ char*->array ][ !!! *1* !!! ][ 108 ][ 20 ][ 12 ]] [[ char*->string ][ !!! *8* !!! ][ 125 ][ 28 ][ --- ]] [[ char*->container::string ][ !!! *2* !!! ][ 123 ][ 24 ][ --- ]] [[ unsigned char*->char ][ !!! *<1* !!! ][ 104 ][ 11 ][ 9 ]] [[ unsigned char*->signed char ][ !!! *<1* !!! ][ 106 ][ 10 ][ 10 ]] [[ unsigned char*->unsigned char ][ !!! *<1* !!! ][ 101 ][ 10 ][ 10 ]] [[ unsigned char*->int ][ !!! *7* !!! ][ 117 ][ 22 ][ 24 ]] [[ unsigned char*->short ][ !!! *6* !!! ][ 111 ][ 26 ][ 22 ]] [[ unsigned char*->long int ][ !!! *8* !!! ][ 111 ][ 23 ][ 23 ]] [[ unsigned char*->long long ][ !!! *8* !!! ][ 114 ][ 21 ][ 23 ]] [[ unsigned char*->unsigned int ][ !!! *7* !!! ][ 115 ][ 20 ][ 25 ]] [[ unsigned char*->unsigned short ][ !!! *6* !!! ][ 113 ][ 20 ][ 22 ]] [[ unsigned char*->unsigned long int ][ !!! *8* !!! ][ 115 ][ 25 ][ 24 ]] [[ unsigned char*->unsigned long long ][ !!! *7* !!! ][ 113 ][ 25 ][ 25 ]] [[ unsigned char*->float ][ !!! *16* !!! ][ 158 ][ 55 ][ 38 ]] [[ unsigned char*->double ][ !!! *12* !!! ][ 155 ][ 62 ][ 40 ]] [[ unsigned char*->long double ][ 108 ][ 153 ][ 60 ][ !!! *41* !!! ]] [[ unsigned char*->array ][ !!! *1* !!! ][ 111 ][ 19 ][ 12 ]] [[ unsigned char*->string ][ !!! *8* !!! ][ 125 ][ 30 ][ --- ]] [[ unsigned char*->container::string ][ !!! *4* !!! ][ 121 ][ 23 ][ --- ]] [[ signed char*->char ][ !!! *<1* !!! ][ 98 ][ 14 ][ 9 ]] [[ signed char*->signed char ][ !!! *<1* !!! ][ 98 ][ 11 ][ 10 ]] [[ signed char*->unsigned char ][ !!! *<1* !!! ][ 99 ][ 10 ][ 10 ]] [[ signed char*->int ][ !!! *7* !!! ][ 111 ][ 22 ][ 24 ]] [[ signed char*->short ][ !!! *6* !!! ][ 123 ][ 22 ][ 23 ]] [[ signed char*->long int ][ !!! *8* !!! ][ 112 ][ 21 ][ 23 ]] [[ signed char*->long long ][ !!! *8* !!! ][ 114 ][ 24 ][ 24 ]] [[ signed char*->unsigned int ][ !!! *6* !!! ][ 114 ][ 19 ][ 22 ]] [[ signed char*->unsigned short ][ !!! *6* !!! ][ 112 ][ 21 ][ 24 ]] [[ signed char*->unsigned long int ][ !!! *8* !!! ][ 114 ][ 23 ][ 22 ]] [[ signed char*->unsigned long long ][ !!! *8* !!! ][ 116 ][ 22 ][ 24 ]] [[ signed char*->float ][ !!! *16* !!! ][ 156 ][ 55 ][ 38 ]] [[ signed char*->double ][ !!! *12* !!! ][ 151 ][ 59 ][ 39 ]] [[ signed char*->long double ][ 111 ][ 159 ][ 60 ][ !!! *44* !!! ]] [[ signed char*->array ][ !!! *1* !!! ][ 107 ][ 24 ][ 12 ]] [[ signed char*->string ][ !!! *8* !!! ][ 122 ][ 28 ][ --- ]] [[ signed char*->container::string ][ !!! *4* !!! ][ 122 ][ 23 ][ --- ]] [[ iterator_range->char ][ !!! *<1* !!! ][ 103 ][ 13 ][ 10 ]] [[ iterator_range->signed char ][ !!! *<1* !!! ][ 103 ][ 13 ][ 10 ]] [[ iterator_range->unsigned char ][ !!! *<1* !!! ][ 104 ][ 14 ][ 10 ]] [[ iterator_range->int ][ !!! *6* !!! ][ 115 ][ 23 ][ 24 ]] [[ iterator_range->short ][ !!! *7* !!! ][ 111 ][ 21 ][ 24 ]] [[ iterator_range->long int ][ !!! *7* !!! ][ 108 ][ 21 ][ 23 ]] [[ iterator_range->long long ][ !!! *7* !!! ][ 114 ][ 24 ][ 23 ]] [[ iterator_range->unsigned int ][ !!! *6* !!! ][ 111 ][ 22 ][ 23 ]] [[ iterator_range->unsigned short ][ !!! *5* !!! ][ 114 ][ 20 ][ 23 ]] [[ iterator_range->unsigned long int ][ !!! *7* !!! ][ 119 ][ 25 ][ 24 ]] [[ iterator_range->unsigned long long ][ !!! *7* !!! ][ 110 ][ 20 ][ 24 ]] [[ iterator_range->float ][ !!! *15* !!! ][ 148 ][ 38 ][ 40 ]] [[ iterator_range->double ][ !!! *10* !!! ][ 146 ][ 41 ][ 40 ]] [[ iterator_range->long double ][ 103 ][ 138 ][ !!! *39* !!! ][ 42 ]] [[ iterator_range->array ][ !!! *<1* !!! ][ 109 ][ 22 ][ 13 ]] [[ iterator_range->string ][ !!! *7* !!! ][ 121 ][ 32 ][ --- ]] [[ iterator_range->container::string ][ !!! *3* !!! ][ 120 ][ 24 ][ --- ]] [[ array->char ][ !!! *<1* !!! ][ 102 ][ 9 ][ 9 ]] [[ array->signed char ][ !!! *<1* !!! ][ 97 ][ 9 ][ 10 ]] [[ array->unsigned char ][ !!! *<1* !!! ][ 99 ][ 9 ][ 10 ]] [[ array->int ][ !!! *7* !!! ][ 114 ][ 22 ][ 23 ]] [[ array->short ][ !!! *6* !!! ][ 116 ][ 21 ][ 23 ]] [[ array->long int ][ !!! *7* !!! ][ 109 ][ 20 ][ 23 ]] [[ array->long long ][ !!! *7* !!! ][ 114 ][ 21 ][ 23 ]] [[ array->unsigned int ][ !!! *7* !!! ][ 119 ][ 20 ][ 25 ]] [[ array->unsigned short ][ !!! *6* !!! ][ 120 ][ 20 ][ 23 ]] [[ array->unsigned long int ][ !!! *7* !!! ][ 113 ][ 20 ][ 21 ]] [[ array->unsigned long long ][ !!! *7* !!! ][ 112 ][ 20 ][ 24 ]] [[ array->float ][ !!! *16* !!! ][ 155 ][ 57 ][ 38 ]] [[ array->double ][ !!! *11* !!! ][ 152 ][ 59 ][ 42 ]] [[ array->long double ][ 107 ][ 152 ][ 60 ][ !!! *41* !!! ]] [[ array->array ][ !!! *1* !!! ][ 111 ][ 20 ][ 12 ]] [[ array->string ][ !!! *8* !!! ][ 123 ][ 36 ][ --- ]] [[ array->container::string ][ !!! *4* !!! ][ 128 ][ 23 ][ --- ]] [[ int->int ][ !!! *<1* !!! ][ 118 ][ 26 ][ --- ]] [[ float->double ][ !!! *<1* !!! ][ 233 ][ 120 ][ --- ]] [[ char->signed char ][ !!! *<1* !!! ][ 97 ][ 8 ][ --- ]] ] [endsect] [section GNU C++ version 4.4.7] [table:id Performance Table ( GNU C++ version 4.4.7) [[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]] [[ string->char ][ !!! *<1* !!! ][ 111 ][ 8 ][ 9 ]] [[ string->signed char ][ !!! *<1* !!! ][ 100 ][ 8 ][ 10 ]] [[ string->unsigned char ][ !!! *<1* !!! ][ 102 ][ 8 ][ 11 ]] [[ string->int ][ !!! *6* !!! ][ 114 ][ 21 ][ 23 ]] [[ string->short ][ !!! *5* !!! ][ 120 ][ 21 ][ 29 ]] [[ string->long int ][ !!! *7* !!! ][ 114 ][ 22 ][ 26 ]] [[ string->long long ][ !!! *7* !!! ][ 118 ][ 21 ][ 23 ]] [[ string->unsigned int ][ !!! *7* !!! ][ 115 ][ 21 ][ 23 ]] [[ string->unsigned short ][ !!! *5* !!! ][ 119 ][ 18 ][ 22 ]] [[ string->unsigned long int ][ !!! *7* !!! ][ 115 ][ 20 ][ 23 ]] [[ string->unsigned long long ][ !!! *9* !!! ][ 116 ][ 26 ][ 24 ]] [[ string->float ][ !!! *12* !!! ][ 165 ][ 53 ][ 40 ]] [[ string->double ][ !!! *12* !!! ][ 154 ][ 54 ][ 40 ]] [[ string->long double ][ 112 ][ 148 ][ 61 ][ !!! *45* !!! ]] [[ string->array ][ !!! *<1* !!! ][ 120 ][ 19 ][ 14 ]] [[ string->string ][ !!! *2* !!! ][ 141 ][ 55 ][ --- ]] [[ string->container::string ][ !!! *2* !!! ][ 164 ][ 36 ][ --- ]] [[ string->char ][ !!! *7* !!! ][ 161 ][ 24 ][ 18 ]] [[ string->signed char ][ !!! *6* !!! ][ 109 ][ 25 ][ 24 ]] [[ string->unsigned char ][ !!! *6* !!! ][ 109 ][ 25 ][ 25 ]] [[ int->string ][ !!! *11* !!! ][ 128 ][ 32 ][ 23 ]] [[ short->string ][ !!! *12* !!! ][ 136 ][ 54 ][ 34 ]] [[ long int->string ][ !!! *15* !!! ][ 187 ][ 41 ][ 23 ]] [[ long long->string ][ !!! *11* !!! ][ 128 ][ 30 ][ 29 ]] [[ unsigned int->string ][ !!! *13* !!! ][ 124 ][ 29 ][ 23 ]] [[ unsigned short->string ][ !!! *11* !!! ][ 128 ][ 30 ][ 22 ]] [[ unsigned long int->string ][ !!! *11* !!! ][ 131 ][ 30 ][ 22 ]] [[ unsigned long long->string ][ !!! *11* !!! ][ 133 ][ 33 ][ 29 ]] [[ float->string ][ 52 ][ 187 ][ 90 ][ !!! *39* !!! ]] [[ double->string ][ 58 ][ 190 ][ 86 ][ !!! *45* !!! ]] [[ long double->string ][ 70 ][ 218 ][ 88 ][ !!! *47* !!! ]] [[ char*->char ][ !!! *<1* !!! ][ 99 ][ 11 ][ 9 ]] [[ char*->signed char ][ !!! *<1* !!! ][ 99 ][ 11 ][ 10 ]] [[ char*->unsigned char ][ !!! *<1* !!! ][ 100 ][ 12 ][ 10 ]] [[ char*->int ][ !!! *6* !!! ][ 117 ][ 23 ][ 21 ]] [[ char*->short ][ !!! *6* !!! ][ 115 ][ 28 ][ 23 ]] [[ char*->long int ][ !!! *7* !!! ][ 119 ][ 22 ][ 24 ]] [[ char*->long long ][ !!! *7* !!! ][ 114 ][ 23 ][ 22 ]] [[ char*->unsigned int ][ !!! *6* !!! ][ 113 ][ 21 ][ 21 ]] [[ char*->unsigned short ][ !!! *6* !!! ][ 120 ][ 21 ][ 21 ]] [[ char*->unsigned long int ][ !!! *7* !!! ][ 117 ][ 25 ][ 23 ]] [[ char*->unsigned long long ][ !!! *7* !!! ][ 119 ][ 23 ][ 21 ]] [[ char*->float ][ !!! *13* !!! ][ 160 ][ 61 ][ 36 ]] [[ char*->double ][ !!! *13* !!! ][ 152 ][ 54 ][ 40 ]] [[ char*->long double ][ 116 ][ 173 ][ 58 ][ !!! *43* !!! ]] [[ char*->array ][ !!! *1* !!! ][ 121 ][ 20 ][ 12 ]] [[ char*->string ][ !!! *7* !!! ][ 126 ][ 29 ][ --- ]] [[ char*->container::string ][ !!! *2* !!! ][ 119 ][ 27 ][ --- ]] [[ unsigned char*->char ][ !!! *<1* !!! ][ 96 ][ 12 ][ 9 ]] [[ unsigned char*->signed char ][ !!! *<1* !!! ][ 95 ][ 11 ][ 12 ]] [[ unsigned char*->unsigned char ][ !!! *<1* !!! ][ 95 ][ 12 ][ 12 ]] [[ unsigned char*->int ][ !!! *6* !!! ][ 113 ][ 27 ][ 24 ]] [[ unsigned char*->short ][ !!! *6* !!! ][ 120 ][ 23 ][ 21 ]] [[ unsigned char*->long int ][ !!! *7* !!! ][ 114 ][ 22 ][ 23 ]] [[ unsigned char*->long long ][ !!! *7* !!! ][ 114 ][ 23 ][ 23 ]] [[ unsigned char*->unsigned int ][ !!! *6* !!! ][ 115 ][ 23 ][ 23 ]] [[ unsigned char*->unsigned short ][ !!! *6* !!! ][ 120 ][ 21 ][ 23 ]] [[ unsigned char*->unsigned long int ][ !!! *7* !!! ][ 117 ][ 23 ][ 21 ]] [[ unsigned char*->unsigned long long ][ !!! *7* !!! ][ 121 ][ 23 ][ 21 ]] [[ unsigned char*->float ][ !!! *12* !!! ][ 161 ][ 58 ][ 39 ]] [[ unsigned char*->double ][ !!! *13* !!! ][ 153 ][ 54 ][ 38 ]] [[ unsigned char*->long double ][ 110 ][ 150 ][ 62 ][ !!! *43* !!! ]] [[ unsigned char*->array ][ !!! *1* !!! ][ 113 ][ 20 ][ 12 ]] [[ unsigned char*->string ][ !!! *8* !!! ][ 124 ][ 30 ][ --- ]] [[ unsigned char*->container::string ][ !!! *3* !!! ][ 118 ][ 27 ][ --- ]] [[ signed char*->char ][ !!! *<1* !!! ][ 99 ][ 11 ][ 9 ]] [[ signed char*->signed char ][ !!! *<1* !!! ][ 102 ][ 12 ][ 10 ]] [[ signed char*->unsigned char ][ !!! *<1* !!! ][ 99 ][ 12 ][ 10 ]] [[ signed char*->int ][ !!! *6* !!! ][ 114 ][ 30 ][ 23 ]] [[ signed char*->short ][ !!! *6* !!! ][ 118 ][ 23 ][ 23 ]] [[ signed char*->long int ][ !!! *7* !!! ][ 119 ][ 22 ][ 21 ]] [[ signed char*->long long ][ !!! *7* !!! ][ 114 ][ 23 ][ 26 ]] [[ signed char*->unsigned int ][ !!! *6* !!! ][ 114 ][ 26 ][ 23 ]] [[ signed char*->unsigned short ][ !!! *6* !!! ][ 121 ][ 22 ][ 23 ]] [[ signed char*->unsigned long int ][ !!! *7* !!! ][ 126 ][ 23 ][ 21 ]] [[ signed char*->unsigned long long ][ !!! *7* !!! ][ 114 ][ 22 ][ 21 ]] [[ signed char*->float ][ !!! *12* !!! ][ 163 ][ 57 ][ 39 ]] [[ signed char*->double ][ !!! *13* !!! ][ 156 ][ 53 ][ 40 ]] [[ signed char*->long double ][ 112 ][ 156 ][ 56 ][ !!! *42* !!! ]] [[ signed char*->array ][ !!! *1* !!! ][ 117 ][ 20 ][ 12 ]] [[ signed char*->string ][ !!! *8* !!! ][ 127 ][ 28 ][ --- ]] [[ signed char*->container::string ][ !!! *4* !!! ][ 112 ][ 27 ][ --- ]] [[ iterator_range->char ][ !!! *<1* !!! ][ 103 ][ 14 ][ 9 ]] [[ iterator_range->signed char ][ !!! *<1* !!! ][ 104 ][ 16 ][ 10 ]] [[ iterator_range->unsigned char ][ !!! *<1* !!! ][ 103 ][ 16 ][ 10 ]] [[ iterator_range->int ][ !!! *6* !!! ][ 121 ][ 22 ][ 21 ]] [[ iterator_range->short ][ !!! *7* !!! ][ 112 ][ 23 ][ 23 ]] [[ iterator_range->long int ][ !!! *7* !!! ][ 115 ][ 24 ][ 23 ]] [[ iterator_range->long long ][ !!! *7* !!! ][ 113 ][ 24 ][ 23 ]] [[ iterator_range->unsigned int ][ !!! *6* !!! ][ 117 ][ 26 ][ 23 ]] [[ iterator_range->unsigned short ][ !!! *5* !!! ][ 120 ][ 20 ][ 23 ]] [[ iterator_range->unsigned long int ][ !!! *7* !!! ][ 124 ][ 28 ][ 21 ]] [[ iterator_range->unsigned long long ][ !!! *7* !!! ][ 113 ][ 22 ][ 21 ]] [[ iterator_range->float ][ !!! *11* !!! ][ 190 ][ 58 ][ 63 ]] [[ iterator_range->double ][ !!! *20* !!! ][ 194 ][ 44 ][ 39 ]] [[ iterator_range->long double ][ 116 ][ 145 ][ 46 ][ !!! *44* !!! ]] [[ iterator_range->array ][ !!! *<1* !!! ][ 116 ][ 23 ][ 15 ]] [[ iterator_range->string ][ !!! *7* !!! ][ 127 ][ 33 ][ --- ]] [[ iterator_range->container::string ][ !!! *3* !!! ][ 112 ][ 24 ][ --- ]] [[ array->char ][ !!! *<1* !!! ][ 98 ][ 11 ][ 10 ]] [[ array->signed char ][ !!! *<1* !!! ][ 99 ][ 12 ][ 15 ]] [[ array->unsigned char ][ !!! *<1* !!! ][ 100 ][ 11 ][ 10 ]] [[ array->int ][ !!! *6* !!! ][ 114 ][ 27 ][ 22 ]] [[ array->short ][ !!! *5* !!! ][ 113 ][ 23 ][ 23 ]] [[ array->long int ][ !!! *7* !!! ][ 118 ][ 22 ][ 23 ]] [[ array->long long ][ !!! *7* !!! ][ 114 ][ 26 ][ 23 ]] [[ array->unsigned int ][ !!! *6* !!! ][ 113 ][ 27 ][ 23 ]] [[ array->unsigned short ][ !!! *5* !!! ][ 124 ][ 21 ][ 23 ]] [[ array->unsigned long int ][ !!! *7* !!! ][ 116 ][ 23 ][ 21 ]] [[ array->unsigned long long ][ !!! *7* !!! ][ 115 ][ 22 ][ 21 ]] [[ array->float ][ !!! *11* !!! ][ 162 ][ 58 ][ 36 ]] [[ array->double ][ !!! *13* !!! ][ 155 ][ 54 ][ 44 ]] [[ array->long double ][ 111 ][ 149 ][ 55 ][ !!! *42* !!! ]] [[ array->array ][ !!! *1* !!! ][ 114 ][ 18 ][ 14 ]] [[ array->string ][ !!! *7* !!! ][ 129 ][ 29 ][ --- ]] [[ array->container::string ][ !!! *3* !!! ][ 113 ][ 26 ][ --- ]] [[ int->int ][ !!! *<1* !!! ][ 114 ][ 25 ][ --- ]] [[ float->double ][ !!! *<1* !!! ][ 236 ][ 121 ][ --- ]] [[ char->signed char ][ !!! *<1* !!! ][ 97 ][ 8 ][ --- ]] ] [endsect] [/ END of section, generated by performance measuring program ] [endsect]