Объединить Инты в массив?
в рамках домашнего задания мне нужно объединить определенные значения в массиве на 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];
вывод будет целым числом (не строкой)
вещи, которые вы можете сделать:
- убедитесь, что вы компилируете с
-O3
(или эквивалентная оптимизация компилятора). - вы сами генерируете значения в векторе? Если да, попробуйте изменить
toInt()
функция для принятия простого типа указателя. -
напишите преобразование самостоятельно (код браузера: может даже не компилироваться-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; }