秘笈14 将数值转换为字符串
在这个秘笈中,我们将继续讨论词汇的转换,但现在使用Boost.LexicalCast将数值转换为字符串。和往常一样,boost::lexical_cast将提供一个非常简单的方法来转换数据。
准备
这个秘笈只需要有C++和STL的基础知识。
做法
1.使用boost::lexical_cast将整数100转换为std::string:

2.将此法与传统的C++的转换方法相比较:

与C的转换方法对比:

工作原理
boost::lexical_cast函数也接受数值作为输入,并将其转换为在尖括号中指定的字符串类型。这很接近我们在以前的秘笈中所做的事情。
还有更多
细心的读者会注意到,在lexical_cast的情况下,对字符串复制构造函数有一个额外的调用,而这样的调用对性能将是一个打击。这是事实,但仅限于旧的或差劲的编译器。现代编译器实现了命名返回值优化(Named Return Value Optimizationk, NRVO),其将消除对复制构造函数和析构函数不必要的调用。即使C++11兼容编译器不检测NRVO,也将使用std::string的移动复制构造函数,其速度快并且效率高。Boost.LexicalCast文档的性能部分显示了不同类型的不同编译器的转换速度,并且在大多数情况下,lexical_cast的速度比std::stringstream和printf函数的速度都快。
如果将boost::array或std::array作为输出参数类型传递给boost::lexical_cast,只会发生较少的动态内存分配(或者根本不会发生内存分配,这取决于std::locale的实现)。
参见
Boost的官方文档中包含lexical_cast与其他转换方法的性能的比较表格。而且在大多数情况下,lexical_cast获胜。该文档位于http://www.boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast.html,其中也有一些其他的例子和常见问题的解答。
参考秘笈13。
参考秘笈16。