在C++中转换int为等效的最简单方法是什么?string我知道两种方法.有没有更简单的方法?
(1)
int a = 10;
char *intStr = itoa(a);
string str = string(intStr);
Run Code Online (Sandbox Code Playgroud)
(2)
int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
Run Code Online (Sandbox Code Playgroud) 我必须格式化std::string用sprintf,并将其发送到文件流.我怎样才能做到这一点?
将int转换为字符串的最短路径是什么,最好是内联的?使用stl和boost的答案将受到欢迎.
任何人都可以击败我的整数到std :: string代码的性能,链接如下?
已经有几个问题可以解释如何将整数转换为std::stringC++中的整数,例如这个,但是所提供的解决方案都没有效率.
以下是一些可用于竞争的常用方法的编译就绪代码:
与流行的看法相反,boost::lexical_cast有自己的实现(白皮书)并且不使用stringstream和数字插入运算符.我真的希望看到它的性能比较,因为另一个问题表明它很悲惨.
我自己的贡献,在桌面计算机上具有竞争力,并演示了一种在嵌入式系统上全速运行的方法,与依赖整数模数的算法不同:
如果您想使用该代码,我将根据简化的BSD许可证提供(允许商业使用,需要归属).请问.
最后,该功能ltoa是非标准的,但可广泛使用.
我很快就会发布我的性能测量结果.
std::string.INT_MIN在绝对值无法表示的二进制补码机上测试代码.stringstream,http://ideone.com/jh3Sa,但任何事情,这显然是理解的,因为正确的号码也是OK.除了更好的算法,我还想在几个不同的平台和编译器上获得一些基准测试(让我们使用MB/s吞吐量作为我们的标准测量单位).我相信我的算法代码(我知道sprintf基准测试需要一些快捷方式 - 现在已经修复)是标准的明确定义的行为,至少在ASCII假设下,但是如果你看到任何未定义的行为或输出的输出无效,请指出.
不同的算法对g ++和VC2010执行,可能是由于std::string每个算法的实现不同.VC2010显然在NRVO方面做得更好,摆脱了价值回报只对gcc有帮助.
发现代码的性能优于sprintf一个数量级. ostringstream落后50倍甚至更多.
挑战的胜利者是user434507,他在gcc上生成的代码运行速度是我自己的350%.由于SO社区的突发奇想,其他条目将被关闭.
目前(最终?)速度冠军是:
sprintf …我知道的唯一方法是:
#include <sstream>
#include <string.h>
using namespace std;
int main() {
int number=33;
stringstream strs;
strs << number;
string temp_str = strs.str();
char* char_type = (char*) temp_str.c_str();
}
Run Code Online (Sandbox Code Playgroud)
但是有没有更少打字的方法?
问题:我有一个整数; 这个整数需要转换为stl :: string类型.
在过去,我曾经stringstream做过转换,这有点麻烦.我知道C方式是做一个sprintf,但我宁愿做一个类型安全(呃)的C++方法.
有一个更好的方法吗?
这是我过去使用的字符串流方法:
std::string intToString(int i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Run Code Online (Sandbox Code Playgroud)
当然,这可以改写如下:
template<class T>
std::string t_to_string(T i)
{
std::stringstream ss;
std::string s;
ss << i;
s = ss.str();
return s;
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为这是一个相当"重量级"的实施.
Zan指出,调用非常好,但是:
std::string s = t_to_string(my_integer);
Run Code Online (Sandbox Code Playgroud)
无论如何,一个更好的方式将是......很好.
有关:
可能重复:
如何在C++中将字符串解析为int?
如何将C++字符串转换为int?
假设您希望字符串中包含实际数字(例如,"1","345","38944").
另外,让我们假设你没有提升,你真的想用C++方式来做,而不是狡猾的旧C方式.
我有一些不同长度的数字(如1,999,76492,等等),我想将它们全部转换为具有共同长度的字符串(例如,如果长度为6,那么这些字符串将为:'000001' ,'000999','076492').
换句话说,我需要在数字中添加正确数量的前导零.
int n = 999;
string str = some_function(n,6);
//str = '000999'
Run Code Online (Sandbox Code Playgroud)
在C++中有这样的函数吗?
我试图选择一种将积分转换为字符串的标准方法,所以我接着通过测量3种方法的执行时间进行了一次小的性能评估
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <chrono>
#include <random>
#include <exception>
#include <type_traits>
#include <boost/lexical_cast.hpp>
using namespace std;
// 1. A way to easily measure elapsed time -------------------
template<typename TimeT = std::chrono::milliseconds>
struct measure
{
template<typename F>
static typename TimeT::rep execution(F const &func)
{
auto start = std::chrono::system_clock::now();
func();
auto duration = std::chrono::duration_cast< TimeT>(
std::chrono::system_clock::now() - start);
return duration.count();
}
};
// -----------------------------------------------------------
// 2. Define the convertion functions …Run Code Online (Sandbox Code Playgroud) 如果我包含stdlib.h,那么也无法识别itoa().我的代码:
%{
#include "stdlib.h"
#include <stdio.h>
#include <math.h>
int yylex(void);
char p[10]="t",n1[10];
int n ='0';
%}
%union
{
char *dval;
}
%token ID
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%type <dval> S
%type <dval> E
%%
S : ID '=' E {printf(" x = %sn",$$);}
;
E : ID {}
| E '+' E {n++;itoa(n,n1,10);printf(" %s = %s + %s ",p,$1,$3);strcpy($$,p);strcat($$,n1);}
| E '-' E {n++;itoa(n,n1,10);printf(" %s = %s – %s ",p,$1,$3);strcpy($$,p);strcat($$,n1);}
| E '*' E {n++;itoa(n,n1,10);printf(" %s …Run Code Online (Sandbox Code Playgroud) c++ ×9
integer ×4
string ×4
int ×3
stdstring ×3
stl ×2
boost ×1
c++11 ×1
const-char ×1
formatting ×1
gcc ×1
itoa ×1
parsing ×1
performance ×1