将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 atoi
和itoa
的对应部分,但用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太小,不能用作例子,但是我希望你明白。