Объединить целые числа в массиве? - PullRequest
7 голосов
/ 25 марта 2012

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

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

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

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

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

РЕДАКТИРОВАТЬ: Просто уточнить, мне нужен результат, чтобы бытьвнутр.

Ответы [ 5 ]

5 голосов
/ 25 марта 2012

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

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

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

3 голосов
/ 25 марта 2012

Как насчет:

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

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

1 голос
/ 25 марта 2012

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

char concat[vSize+1];
concat[vSize] = 0;
for(int i = 0; i < vSize; i++) {
    concat[i] = (v[i] % 10) & 0x30;
}
1 голос
/ 25 марта 2012

Все целые числа.Если вы не сделаете следующее.

//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 голосов
/ 25 марта 2012

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

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

    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;
    }
    
...