Вот логика: если вы определяете новый экземпляр класса 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;
Существует несколько опций, и какой, который Вы хотите, зависит от контекста.
самый простой путь
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 начинает выглядеть более привлекательным.
cout << text << i;
<<
оператор для ostream возвращает ссылку на ostream, таким образом, можно просто продолжать объединять в цепочку эти <<
операции. Таким образом, вышеупомянутое является в основном тем же как:
cout << text;
cout << i;
Для записи можно также использовать std::stringstream
, если Вы хотите создать строку, прежде чем это будет на самом деле произведено.
printf("Player %d", i);
(Downvote мой ответ все Вам нравится; я все еще ненавижу операторы I/O C++.)
:-P
Они работают на общие строки (в случае, если Вы не хотите производить в файл/консоль, но хранилище для более позднего использования или чего-то).
повышение 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;
Ну, при использовании суда, можно просто записать целое число непосредственно в него, как в
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);
Это также работает наоборот, т.е. проанализировать строки.
Другая возможность - 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;
}