作为家庭作业的一部分,我需要在C ++中连接数组中的某些值。所以,例如,如果我有:
int v[] = {0,1,2,3,4}
我可能需要在某个时候连接v [1] - > v [4]这样我得到一个值为1234的int。
我使用stringstream工作,将值附加到stringstream然后转换回整数。但是,在整个程序中,最终会有大约300万个不同的v []排列传递给我的toInt()函数,而stringstream似乎相当昂贵(至少在处理那么多值时)。它正在工作,但速度很慢,我正在尽我所能来优化它。
在C ++中是否有更优化的方法来连接数组中的int?我已经做了一些搜索,几乎所有地方似乎只是建议使用stringstream(这可行,但似乎正在减慢我的程序很多)。
编辑:只是说明一下,我确实需要将结果作为一个int。
答案 0 :(得分:5)
一个简单解决方案的伪代码:
int result = 0;
for (int i=0; i < len(v); i++)
{
result = result*10 + v[i];
}
由于int size溢出,大型数组将弹出。
答案 1 :(得分:3)
怎么样:
int result = (((v[1])*10+v[2])*10+v[3])*10+v[4];
如果元素的数量是可变的而不是固定的数字,我相信你可以在这里发现一个可以在循环中应用的模式。
答案 2 :(得分: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];
输出将是整数(不是字符串)
答案 3 :(得分:1)
还记得ASCII代码吗?
char concat[vSize+1];
concat[vSize] = 0;
for(int i = 0; i < vSize; i++) {
concat[i] = (v[i] % 10) & 0x30;
}
答案 4 :(得分:0)
你可以做的事情:
-O3
(或等效的编译器优化)进行编译。toInt()
函数以接受简单的指针类型。自己编写转换(浏览器代码:甚至可能无法编译 - 但是你得到了想法):
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;
}