Объединить Инты в массив?

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

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

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

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

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

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

5 ответов


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

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

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


Как насчет:

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

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


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

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

все целые. Не следует ли вам сделать следующее.

//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];

вывод будет целым числом (не строкой)


вещи, которые вы можете сделать:

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

    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 = '';
      return buf;
    }