Как вы добавляете int к строке в C ++? [Дубликат]

Вот логика: если вы определяете новый экземпляр класса StringBuilder без конструктора, например new StringBuilder();, емкость по умолчанию равна 16. Конструктор может быть либо int, либо String. Для конструктора String значение по умолчанию рассчитывается следующим образом:

int newCapacity = string.length() + 16;

Для конструктора int мощность вычисляется так же

int newCapacity = intSpecified + 16;

. Если новый String добавляется к StringBuilder, а новая длина String больше текущей емкости, тогда мощность вычисляется следующим образом:

int newCapacity = (oldCapacity + 1) * 2;
143
задан LogicStuff 22 December 2015 в 22:31
поделиться

11 ответов

cout << text << " " << i << endl;
0
ответ дан sth 22 December 2015 в 22:31
поделиться
cout << "Player" << i ;
0
ответ дан sth 22 December 2015 в 22:31
поделиться

Существует несколько опций, и какой, который Вы хотите, зависит от контекста.

самый простой путь

std::cout << text << i;

или если Вы хотите это на одной строке

std::cout << text << i << endl;

, Если Вы пишете единственную потоковую программу и если Вы не называете этот код много (где "много" - тысячи времен в секунду), тогда, Вы сделаны.

, Если Вы пишете, многопоточная программа и больше чем один поток пишут в суд, тогда этот простой код может получить Вас в проблему. Давайте предположим, что библиотека, которая шла с Вашим компилятором, сделанным судом, достаточно ориентированным на многопотоковое исполнение, чем какой-либо единственный вызов к нему, не будет прервана. Теперь скажем, тот один поток использует этот код, чтобы записать "Плееру 1", и другой пишет "Плееру 2". Если Вы удачливы, что получите следующее:

Player 1
Player 2

, Если Вы неудачны, Вы могли бы получить что-то как следующий

Player Player 2
1

, проблема состоит в том что станд.:: суд < < текст < < я < < endl; превращается в 3 вызова функции. Код эквивалентен следующему:

std::cout << text;
std::cout << i;
std::cout << endl;

вместо этого при использовании C-стиля printf, и снова компилятор предоставил библиотеке времени выполнения разумную потокобезопасность (каждый вызов функции является атомарным), тогда, следующий код работал бы лучше:

printf("Player %d\n", i);

Способность сделать что-то в единственном вызове функции позволяет io библиотеке обеспечить синхронизацию под покрытиями, и теперь Ваша целая строка текста будет атомарно записана.

Для простых программ, станд.:: суд является большим. Добавьте многопоточность или другие сложности, и менее стильный printf начинает выглядеть более привлекательным.

-1
ответ дан 22 December 2015 в 22:31
поделиться
  • 1
    и, конечно, измените localhost:3000 на соответствующий домен в производстве – thenengah 19 June 2010 в 09:59
cout << text << i;
1
ответ дан sth 22 December 2015 в 22:31
поделиться
cout << text << i;

<< оператор для ostream возвращает ссылку на ostream, таким образом, можно просто продолжать объединять в цепочку эти << операции. Таким образом, вышеупомянутое является в основном тем же как:

cout << text;
cout << i;
0
ответ дан sth 22 December 2015 в 22:31
поделиться
cout << text << " " << i << endl;
6
ответ дан jjnguy 22 December 2015 в 22:31
поделиться
  • 1
    к вашему сведению - слияние! возвращает хеш который doesn' t имеют предоставлять метод. – Akshay Rawat 4 March 2013 в 19:00

Для записи можно также использовать std::stringstream , если Вы хотите создать строку, прежде чем это будет на самом деле произведено.

9
ответ дан LogicStuff 22 December 2015 в 22:31
поделиться
printf("Player %d", i);

(Downvote мой ответ все Вам нравится; я все еще ненавижу операторы I/O C++.)

:-P

113
ответ дан Peter Mortensen 22 December 2015 в 22:31
поделиться

Они работают на общие строки (в случае, если Вы не хотите производить в файл/консоль, но хранилище для более позднего использования или чего-то).

повышение lexical_cast

MyStr += boost::lexical_cast<std::string>(MyInt);

Строковые потоки

//sstream.h
std::stringstream Stream;
Stream.str(MyStr);
Stream << MyInt;
MyStr = Stream.str();

// If you're using a stream (for example, cout), rather than std::string
someStream << MyInt;
19
ответ дан Peter Mortensen 22 December 2015 в 22:31
поделиться

Ну, при использовании суда, можно просто записать целое число непосредственно в него, как в

std::cout << text << i;

C++, который способ преобразовать все виды объектов к строкам до строковые потоки . Если у Вас нет одного удобного, просто создайте тот.

#include <sstream>

std::ostringstream oss;
oss << text << i;
std::cout << oss.str();

, С другой стороны, можно просто преобразовать целое число и добавить его к строке.

oss << i;
text += oss.str();

Наконец, библиотеки Boost обеспечивают boost::lexical_cast , который переносит stringstream преобразование с синтаксисом как встроенные броски типа.

#include <boost/lexical_cast.hpp>

text += boost::lexical_cast<std::string>(i);

Это также работает наоборот, т.е. проанализировать строки.

189
ответ дан Sebastian Redl 22 December 2015 в 22:31
поделиться
  • 1
    Спасибо за ответ. Я видел, что статья, и именно это я подразумевал под перезагрузкой smtp настройки перед каждой почтой (который является тем, что статья сделала в load_settings методе). Это близко к решению, но оно портит ExceptionNotifier, потому что я не могу перезагрузить настройки для него, не изменяя плагин. Я надеялся там на что-то более удобное в сопровождении. –  13 October 2009 в 20:55

Другая возможность - Boost.Format :

#include <boost/format.hpp>
#include <iostream>
#include <string>

int main() {
  int i = 4;
  std::string text = "Player";
  std::cout << boost::format("%1% %2%\n") % text % i;
}
3
ответ дан 23 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: