Кой е най-лесният начин за преобразуване на инт
в еквивалентен нишка
в C++. Наясно съм с два метода. Има ли някакъв по-лесен начин?
(1)
int a = 10;
char *intStr = itoa(a);
string str = string(intStr);
(2)
int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
След като няколко години по-късно продължихме дискусията с @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 ) );
Оригинален отговор:
Тъй като "конвертирането на ... в низ" е повтарящ се проблем, аз винаги дефинирам макроса SSTR() в централното заглавие на моите източници на C++:
#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<>
); и двете други решения обаче имат по-добра производителност.
Вероятно най-разпространеният лесен начин е вторият ви избор да се вгради в шаблон с име lexical_cast
, като този в Boost, така че кодът ви да изглежда така:
int a = 10;
string s = lexical_cast<string>(a);
Едно от предимствата на този метод е, че той поддържа и други хвърляния (например, в обратна посока работи също толкова добре).
Също така отбележете, че макар Boost lexical_cast да започна като просто записване в низ от потоци и след това извличане обратно от потока, сега има няколко допълнения. На първо място, добавени са специализации за доста типове, така че за много често срещани типове тя е значително по-бърза от използването на низ от потоци. На второ място, сега се проверява резултатът, така че (например) ако конвертирате от низ в инт
, може да се хвърли изключение, ако низът съдържа нещо, което не може да се конвертира в инт
(например 1234
ще успее, но 123abc
ще се хвърли).
От C++11 има функция std::to_string
, претоварена за целочислени типове, така че можете да използвате код като:
int a = 20;
std::string s = to_string(a);
Стандартът ги определя като еквивалентни на преобразуване с sprintf
(като се използва спецификаторът за преобразуване, който съответства на предоставения тип обект, например %d
за int
), в буфер с достатъчен размер, след което се създава std::string
от съдържанието на този буфер.