在C++中将int转换为等价字符串的最简单方法是什么?我知道两种方法。有没有更简单的方法?

(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++17提供std::to_chars作为一种更高性能的独立于语言环境的替代方案。

其他回答

我不知道,在纯C++中。但对你提到的内容稍作修改

string s = string(itoa(a));

应该有效,而且很短。

使用字符串流会更容易:

#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

或生成函数:

#include <sstream>

string IntToString(int a)
{
    ostringstream temp;
    temp << a;
    return temp.str();
}

添加一些语法糖是相当容易的,它允许人们以流式的方式动态地编写字符串

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

现在,您可以向strmake()添加任何所需的内容(前提是为其定义了运算符<<(std::ostream&…)),并使用它代替std::string。

例子:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

C++20:std::format现在将是惯用的方式。


C++17:

几年后,在与@v.oddou的讨论中,C++17提供了一种方法来实现最初基于宏的类型不可知的解决方案(保留在下面),而不需要经历宏的丑陋。

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

用法:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

C++98:

由于“将…转换为字符串”是一个反复出现的问题,我总是在C++源代码的中心标题中定义SSTR()宏:

#include <sstream>

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

使用尽可能简单:

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

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

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

电流C++

从C++11开始,有一个std::to_string函数为整数类型重载,因此可以使用如下代码:

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

标准将其定义为等同于使用sprintf(使用与提供的对象类型匹配的转换说明符,例如%d表示int)将其转换为足够大小的缓冲区,然后创建该缓冲区内容的std::字符串。

旧C++

对于较旧的(早于C++11)编译器,可能最常见的简单方法是将第二个选择打包到一个通常名为lexical_cast的模板中,例如Boost中的模板,因此代码如下:

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

这样做的一个好处是它也支持其他类型的转换(例如,在相反的方向上也可以)。

还要注意,虽然Boost lexical_cast一开始只是写入字符串流,然后从流中提取,但现在它有了一些附加功能。首先,添加了相当多类型的专门化,因此对于许多常见类型,它比使用字符串流快得多。第二,它现在检查结果,因此(例如)如果您从字符串转换为int,如果字符串包含无法转换为int的内容(例如,1234将成功,但123abc将抛出),它可以抛出异常。