Конкатенация строк C ++ - PullRequest
       38

Конкатенация строк C ++

1 голос
/ 07 сентября 2011

Учитывая произвольное число с плавающей точкой, скажем -0.13, предположим, что у нас есть алгоритм, который вычисляет двоичную строку известной длины L для этого числа, один за другим, слева направо.

(Мне нужно сделать это вычисление для расчета порядка Мортоновых ключей для частиц (даны соориндаты), которые, в свою очередь, используются при построении октодеревьев. Я создаю такие двоичные строки для каждого из x, y, z измерений)

Лучше / эффективнее сначала создать массив символов длиной L, а затем преобразовать этот массив в строку? т.е. * +1008 *

char ch[L];

for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
}

//convert array into string

Или лучше / эффективнее начинать с пустой строки, а затем объединять новый вычисленный бит в строку на лету. т.е.

string s = "";

for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
    s = s + string(ch);
}

Ответы [ 6 ]

5 голосов
/ 07 сентября 2011

Почему бы не сделать и то и другое?

std::string myStr(L);

for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
    myStr[i] = ch;
}

Это создает std::string с заданным размером.Затем вы просто устанавливаете каждый символ.Это будет только , если вы точно знаете размер заранее.

В качестве альтернативы, если вы хотите что-то безопасное, даже если вам нужно добавить более L символов:

std::string myStr;
myStr.reserve(L);

for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
    myStr.push_back(ch);
}

std::string::reserve предварительно выделяет хранилище, но push_back выделит больше, если потребуется.Если вы не пройдете L символов, вы получите только одно начальное распределение.

2 голосов
/ 07 сентября 2011

Если вы хотите использовать C ++, используйте ostringstream. Как правило, это более чистый код, менее подвержен ошибкам и легче читаемый:

float f = ... // whatever you set it to
std::ostringstream s;
s << f;
std::string stringifiedfloat = s.str();
// now you have the float in a string.

В качестве альтернативы вы можете использовать способ C, sprintf. Как правило, это более подвержено ошибкам и труднее для чтения, но обеспечивает более высокую производительность:

float f = ... // whatever you set it to
char* buffer = new char[L];
sprintf(buffer, "%f", f);
// now you have the float in a string.

Или вы можете даже использовать буст lexical_cast. Это имеет лучшую производительность, чем ostringstream, и лучшую читаемость, чем sprintf, но дает вам зависимость от boost:

float f = ... // whatever you set it to
std::string stringified = boost::lexical_cast<std::string>(f);
// now you have the float in a string.
2 голосов
/ 07 сентября 2011

Лично я, вероятно, устарел, но я использую

sprintf (char * str, const char * format, ...);

для создания строк из чисел

sprintf (outString, "% f", FloatingPointNumber);

2 голосов
/ 07 сентября 2011

Разве вы не можете просто использовать строку с заранее выделенной длиной?

string s(L, '\0');
for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
}
2 голосов
/ 07 сентября 2011

Я не уверен, что полностью понимаю происходящее преобразование, но у нас есть объекты по причине. Если вы сначала используете std::string::reserve(), производительность должна быть ничтожной, и очевидно, в чем смысл.

string s;
s.reserve(L);
for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
    string.push_back(ch);
}

Если скорость абсолютно необходима, вы можете вместо этого инициализировать строку как длину L и обойти проверку длины:

string s(L,'\0');
for(i = 0; i < L; ++i)
{
    // calculation of ch[i]
    string[i] = ch;
}
2 голосов
/ 07 сентября 2011

Используйте последнее, но также вызовите s.reserve(L) перед входом в цикл.Это почти так же эффективно, как прямое присвоение массива, но все же проще в обработке.

РЕДАКТИРОВАТЬ: Другие ответы предлагают использовать push_back().Голосуйте за них.

Боковая панель: Я не уверен, что вы вычисляете, но если вы просто хотите сгенерировать строковое представление числа, я бы посоветовал вам просто позвонить sprintf(),или введите номер в std::stringstream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...