在数组中连接整数?

时间:2012-03-25 11:03:12

标签: c++ arrays concatenation stringstream

作为家庭作业的一部分,我需要在C ++中连接数组中的某些值。所以,例如,如果我有:

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

我可能需要在某个时候连接v [1] - > v [4]这样我得到一个值为1234的int。

我使用stringstream工作,将值附加到stringstream然后转换回整数。但是,在整个程序中,最终会有大约300万个不同的v []排列传递给我的toInt()函数,而stringstream似乎相当昂贵(至少在处理那么多值时)。它正在工作,但速度很慢,我正在尽我所能来优化它。

在C ++中是否有更优化的方法来连接数组中的int?我已经做了一些搜索,几乎所有地方似乎只是建议使用stringstream(这可行,但似乎正在减慢我的程序很多)。

编辑:只是说明一下,我确实需要将结果作为一个int。

5 个答案:

答案 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)

你可以做的事情:

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