我正在构建我的第一个C++应用程序,选择一个高效的C++库是我考虑的设计之一。因此,我想将整数类型转换为字符串,并决定是否使用以下方法:
sprintf(string, "%d", x);
或者
整数转ASCII码
itoa(x, string);
有人能建议哪一条路线是高效的,并可能解释原因吗?
谢谢。
sprintf(string, "%d", x);
或者
整数转ASCII码
itoa(x, string);
有人能建议哪一条路线是高效的,并可能解释原因吗?
谢谢。
它们都很高效。更重要的是要注意,itoa()
不是C++标准的一部分,因此在许多常见的运行时环境中不可用。(特别是,在libstdc++
中没有包含它,因此在Mac OS X或Linux上不可用。)
不要使用这两个。使用 std::stringstream
等等。
std::stringstream ss;
ss << x;
ss.str(); // Access the std::string
无论如何,将其转换为字符串很可能不会成为您的应用程序执行时间的重要组成部分。
stringstream
在某些应用中非常缓慢(例如在高频交易中),这可能是其中一个显著的因素,而且它不允许转换为现有的 char*
缓冲区。 - Oleg Vazhnev从纯算法的角度来看,可以认为 itoa
更快,因为 sprintf
还需要解析格式说明符字符串。但是在没有对两个函数在实现中进行非平凡工作负载的基准测试之前,我们无法确定。
此外,这不是苹果和苹果之间的比较,因为两个函数不相等。除了前者是标准函数而后者不是之外,sprintf
可以执行比 itoa
更多的格式化操作。
附言:如果您可以使用 C++11,则可以使用返回 std::string
的 to_string
。如果您想要除十进制以外的表示,则可以这样做:
int i = 1234;
std::stringstream ss;
ss << std::hex << i; // hexadecimal
ss << std::oct << i; // octal
ss << std::dec << i; // decimal
std::bitset<sizeof(int) * std::numeric_limits<unsigned char>::digits> b(i);
ss << b; // binary
std::string str = ss.str();
istringstream
жИЦиАЕboost::lexical_cast
жАОдєИж†ЈпЉЯжѓХзЂЯињЩжШѓ C++гАВ - pmrsprintf
。如果您不喜欢stringstream
,那么请使用snprintf
。如果人们使用这种方法,就可以防止许多缓冲区溢出攻击。对于itoa也是同样的道理,但它甚至不是标准C或C++。 - Nicol Bolas