2012-03-25 2 views
7

В качестве части домашнего задания мне нужно объединить определенные значения в массиве в C++. Так, например, если у меня есть:Конкатенировать ints в массиве?

int v[] = {0,1,2,3,4} 

мне может понадобиться в какой-то момент для конкатенации v [1] -> V [4], так что я получаю Int со значением 1234.

меня он работает с использованием stringstream, добавляя значения в строковый поток и затем преобразовывая обратно в целое число. Однако во всей программе в конечном итоге будет около 3 миллионов различных перестановок v [], переданных моей функции toInt(), и строка string кажется довольно дорогой (по крайней мере, имея дело с множеством значений). он работает, но очень медленный, и я пытаюсь сделать все возможное, чтобы его оптимизировать.

Есть ли более оптимальный способ конкатенации int в массиве в C++? Я сделал некоторые поиски и почти везде, кажется, просто предлагает использовать stringstream (который работает, но, похоже, замедляет мою программу).

EDIT: Просто уточняю, мне нужен результат, чтобы быть int.

+2

Что должно произойти, если один из Интс больше 9? Или отрицательный? – Mat

+1

Что означает «конкатенация»? Вам нужны строки или цифры? Что случилось с умножением на 10? –

+0

@Mat - значения в массиве всегда находятся между 0 и 9. – Nate

ответ

5

псевдокод для простого решения:

int result = 0; 
for (int i=0; i < len(v); i++) 
{ 
    result = result*10 + v[i]; 
} 

Большие массивы будут бомбить из-за переполнения ИНТ размера.

+0

Возможно, поплавок или двойной будет лучше? –

+0

Мои значения никогда не могут превышать 5 цифр в этой программе, поэтому функции ints работают нормально. И это то, что я только что закончил, и он отлично работает! Сократите время выполнения в два раза. – Nate

3

Как насчет:

int result = (((v[1])*10+v[2])*10+v[3])*10+v[4]; 

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

+0

Спасибо, вот что мне нужно. Я попробую! – Nate

1

Все являются целыми числами. Разве вы не должны делать следующее.

//if you want to concatenate v[1] and v[4] 
int concatenated; 
concatenated = v[1]*10+v[4]; 
//If you want to concatenate all 
concatenated = 0; 
for(int i=1;i<=4;i++) 
    concatenated = concatenated*10+v[i]; 

результат будет целым числом (не строка)

+0

Да, мне нужен вывод, чтобы быть int. Благодаря! – Nate

1

Помните ASCII коды?

char concat[vSize+1]; 
concat[vSize] = 0; 
for(int i = 0; i < vSize; i++) { 
    concat[i] = (v[i] % 10) & 0x30; 
} 
+0

А, это имеет смысл, спасибо. – Nate

+0

Упс, на самом деле, теперь, когда я читаю ваш пост более тщательно, я ошибаюсь. Я думал, тебе нужна строка. Обратитесь к другим за правильным ответом. –

+1

Я думаю, вы имеете в виду '| 0x30', но все равно '+ '0'' будет более понятным. – hvd

0

Что вы можете сделать:

  1. Убедитесь, что вы компилируете с -O3 (или эквивалент оптимизации компилятора).
  2. Вы сами генерируете значения в векторе? Если да, попробуйте изменить функцию toInt(), чтобы принять простой тип указателя.
  3. Написать преобразование самостоятельно (Browser код: не может даже составить - и получить представление, хотя):

    char* toInt(int* values, size_t length) 
    { 
        int *end = values + sizeof(int)*length; 
        int *cur = values; 
    
        char* buf = new char[length + 1] 
    
        for(char* out = buf;cur < end;++cur, ++buf) 
        { 
         *out = (char)*cur + '0'; 
        } 
        *buf = '\0'; 
        return buf; 
    } 
    
+0

-1 Это очень C-ish. Исключительно опасно возвращать строку C-стиля, выделенную 'new' в C++, потому что вероятность того, что вызывающий абонент забудет удалить строку, что вызывает проблемную утечку памяти, когда функция называется миллионы раз. – leftaroundabout

+0

@leftaroundabout: Не знаю, почему вы его понизили только потому, что код C-ish. Вопроситель спрашивает, как повысить производительность очень простой функции. Я бы не писал приложение таким образом, но для части домашнего задания я определенно буду использовать это. – nakiya

+0

Если бы это было простое и эффективное повышение производительности, я бы не отказался от него. Но ваш код будет скомпилирован ни к чему быстрее, чем любой достойный компилятор сделает из более безопасного варианта _and проще_ с 'std :: vector' /' std :: string'. Измените его, чтобы использовать их, и я поднимусь. – leftaroundabout

Смежные вопросы