将int转换为C ++中的string最简单的方法

什么是从int转换为C ++中的等效string的最简单的方法。 我知道两种方法。 有没有更简单的方法?

1。

int a = 10; char *intStr = itoa(a); string str = string(intStr); 

2。

 int a = 10; stringstream ss; ss << a; string str = ss.str(); 

C ++ 11引入了std::stoi (以及每个数字types的变体)和std::to_string ,C atoiitoa的对应部分,但用std::string

 #include <string> std::string s = std::to_string(42); 

因此是我能想到的最短路线。

注意:参见[string.conversions] (n3242中的21.5

由于“将…转换为string”是一个反复出现的问题,我总是在我的C ++源代码的中心头文件中定义SSTR()macros:

 #include <sstream> #define SSTR( x ) static_cast< std::ostringstream & >( \ ( std::ostringstream() << std::dec << x ) ).str() 

用法很简单:

 int i = 42; std::cout << SSTR( "i is: " << i ); std::string s = SSTR( i ); puts( SSTR( i ).c_str() ); 

以上是C ++ 98兼容(如果你不能使用C ++ 11 std::to_string ),并且不需要任何第三方包含(如果你不能使用Boost lexical_cast<> ); 这两个解决scheme都有更好的performance。

我通常使用以下方法:

 #include <sstream> template <typename T> std::string NumberToString ( T Number ) { std::ostringstream ss; ss << Number; return ss.str(); } 

在这里详细描述。

也许最常见的简单方法实质上是把你的第二select包装到一个名为lexical_cast ,比如Boost中的一个,所以你的代码如下所示:

 int a = 10; string s = lexical_cast<string>(a); 

其中一个好处就是它也支持其他types的转换(例如,相反的方向也可以)。

另外请注意,尽pipeBoost lexical_cast只是写入一个stringstream,然后从stream中提取出来,现在有一些添加。 首先,增加了很多types的专业化,所以对于许多常见的types,它比使用串stream更快。 其次,它现在检查结果,所以(例如)如果你从一个string转换为一个int ,它可以抛出一个exception,如果string包含一些无法转换为int (例如, 1234会成功,但123abc会扔)。

从C ++ 11开始,有一个std::to_string函数为整数types重载,所以你可以使用如下的代码:

 int a = 20; std::string s = to_string(a); 

该标准将这些定义为相当于使用sprintf进行转换(使用与提供的对象types匹配的转换说明符,例如%d作为int ),将其转换为足够大小的缓冲区,然后创buildstd::string该缓冲区的内容。

如果你安装了Boost(你应该):

 #include <boost/lexical_cast.hpp> int num = 4; std::string str = boost::lexical_cast<std::string>(num); 

使用stringstreams不会更容易吗?

 #include <sstream> int x=42; //The integer string str; //The string ostringstream temp; //temp as in temporary temp<<x; str=temp.str(); //str is temp as string 

或者做一个function:

 #include <sstream> string IntToString (int a) { ostringstream temp; temp<<a; return temp.str(); } 

不是我所知道的纯粹的C ++。 但你提到的一点点修改

 string s = string(itoa(a)); 

应该工作,而且很短。

sprintf()对格式转换非常sprintf() 。 然后,您可以像在1中一样将生成的Cstring分配给C ++string。

首先包括:

 #include <string> #include <sstream> 

其次添加方法:

 template <typename T> string NumberToString(T pNumber) { ostringstream oOStrStream; oOStrStream << pNumber; return oOStrStream.str(); } 

使用这样的方法:

 NumberToString(69); 

要么

 int x = 69; string vStr = NumberToString(x) + " Hello word!." 

您可以使用Matthieu M.build议的 C ++ 11中提供的std::to_string

 std::to_string(42); 

或者,如果性能至关重要(例如,如果进行大量转换),则可以使用C ++格式库中的fmt::FormatInt将整数转换为std::string

 fmt::FormatInt(42).str(); 

或者一个Cstring:

 fmt::FormatInt f(42); f.c_str(); 

后者不会执行任何dynamic内存分配,并且比Boost Karma基准testing中std::to_string速度快10倍以上。 有关更多详细信息,请参阅C ++中的快速整数到string转换

std::to_string不同, fmt::FormatInt不需要C ++ 11,可以和任何C ++编译器一起工作。

免责声明:我是C ++格式库的作者。

使用stringstream进行数字转换是危险的!

请参阅http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/它告诉;operator<<插入格式化的输出。

取决于您当前的语言环境大于3位数的整数,可以转换为4位数的string,并添加额外的千位分隔符。

例如, int = 1000可以转换为string1.001 。 这可能会使比较操作根本不起作用。

所以我强烈build议使用std::to_string方式。 这是更容易,做你的期望。

对于C ++ 98 ,有几个选项:

boost/lexical_cast

Boost不是C ++库的一部分,但包含许多有用的库扩展。

lexical_cast函数模板提供了一种方便而一致的forms,用于支持任意types的常见转换,当它们被表示为文本时。
– Boost的文档

 #include "boost/lexical_cast.hpp" #include <string> int main() { int x = 5; std::string x_str = boost::lexical_cast<std::string>(x); return 0; } 

就运行时而言, lexical_cast操作在第一次转换时需要大约80微秒(在我的机器上),然后如果冗余重复,则会大大提高速度。


itoa

这个函数没有在ANSI-C中定义,也不是C ++的一部分,但是被一些编译器支持。
– cplusplus.com

这意味着gcc / g++不能使用itoa编译代码。

 #include <stdlib.h> int main() { int x = 5; char * x_str = new char[2]; x_str = itoa(x, x_str, 10); // base 10 return 0; } 

没有运行时间来报告。 我没有安装Visual Studio, 据报道它能够编译itoa


sprintf

sprintf是C标准库函数,可用于Cstring,是一个完美的替代scheme。

如果在printf上使用了格式,则会使用与要打印的文本相同的文本组成string,但是不会打印,而是将内容作为Cstring存储在str指向的缓冲区中。
– cplusplus.com

 #include <stdio.h> int main() { int x = 5; char * x_str = new char[2]; int chars_written = sprintf(x_str, "%d", x); return 0; } 

stdio.h头可能不是必需的。 至于运行时, sprintf操作在第一次转换时需要大约40微秒(在我的机器上),然后在冗余的情况下大大加速。


stringstream

这是C ++库将整数转换为string的主要方式,反之亦然。 stringstream有类似的姐妹函数,进一步限制了stream的使用,比如ostringstream 。 使用ostringstream特别告诉读者你的代码,你只打算使用<<操作符,本质上。 这个函数是将整数转换为string所特有的。 看到这个问题更详细的讨论。

 #include <sstream> #include <string> int main() { int x = 5; std::ostringstream stream; stream << x; std::string x_str = stream.str(); return 0; } 

至于运行时, ostringstream操作大约需要71微秒(在我的机器上),然后如果冗余完成,速度会大大提高,但不会像以前的function那么多


当然,还有其他的select,你甚至可以将其中的一个包装到自己的function中,但是这提供了一些stream行的分析。

 namespace std { inline string to_string(int _Val) { // convert long long to string char _Buf[2 * _MAX_INT_DIG]; snprintf(_Buf, "%d", _Val); return (string(_Buf)); } } 

你现在可以使用to_string(5)

我用:

 int myint = 0; long double myLD = 0.0; string myint_str = static_cast<ostringstream*>( &(ostringstream() << myint) )->str(); string myLD_str = static_cast<ostringstream*>( &(ostringstream() << myLD) )->str(); 

它适用于我的Windows和Linux g ++编译器。

使用CString

 int a = 10; CString strA; strA.Format("%d", a); 
 string number_to_string(int x){ if(!x) return "0"; string s,s2; while(x){ s.push_back(x%10 + '0'); x/=10; } reverse(s.begin(),s.end()); return s; } 

使用:

 #define convertToString(x) #x main() { convertToString(42); // Returns char* equivalent of 42 } 
 char * bufSecs = new char[32]; char * bufMs = new char[32]; sprintf(bufSecs,"%d",timeStart.elapsed()/1000); sprintf(bufMs,"%d",timeStart.elapsed()%1000); 

如果你需要快速转换一个固定位数的整数到char *左边填充'0',这是一个很方便的例子:

 int n = 27; char s[8]; 

如果您正在转换一个两位数的数字:

 *(int32_t*)s = 0x3030 | (n/10) | (n%10) << 8; 

如果你正在转换一个三位数字:

 *(int32_t*)s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16; 

如果你正在转换一个四位数字:

 *(int64_t*)s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24; 

等高达七位数字:)

您使用计数器types的algorithm来转换为string。 我从编程Commodore 64计算机中获得了这种技术。 这对游戏编程也很有用。

  • 你取整数,并取每个数字加权10的权重。所以假设整数是950。

    • 如果整数等于或大于100,000,则减去100,000,并在[“000000”]处增加string中的计数器;
      继续这样做,直到没有更多的数字10万。 放下另一个十的力量

    • 如果整数等于或大于10,000,则减去10,000,并在[“000000”] +1位置增加string中的计数器;
      继续这样做,直到没有更多的数字在位置10,000。

  • 放下另一个十的力量

  • 重复模式

我知道950太小,不能用作例子,但是我希望你明白。