【问题标题】:Concatenate ints in an array?连接数组中的整数?
【发布时间】:2012-03-25 11:03:11
【问题描述】:

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

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

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

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

在 C++ 中连接数组中的整数是否有更优化的方法?我已经进行了一些搜索,几乎所有地方似乎都建议使用 stringstream(它有效,但似乎大大减慢了我的程序)。

编辑:澄清一下,我确实需要将结果设为 int。

【问题讨论】:

  • 如果其中一个整数大于 9 会发生什么?还是否定的?
  • “连接”是什么意思?你想要字符串还是数字?乘以 10 发生了什么?
  • @Mat - 数组中的值始终介于 0 和 9 之间。
  • "Concatenating ints" 绝对是错误的表达方式。您正在连接 digits,十进制数字。如果这些在你的程序中显示为ints,那么一开始是非常无效的。

标签: c++ arrays concatenation stringstream


【解决方案1】:

简单解决方案的伪代码:

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

大数组会因为 int 大小溢出而被炸毁。

【讨论】:

  • 也许浮点数或双精度会更好?
  • 我的值在这个程序中永远不会超过 5 位,所以整数工作正常。这就是我刚刚实施的,效果很好!将我的执行时间减半。
【解决方案2】:

怎么样:

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

如果元素的数量是可变的而不是固定的数量,我相信您可以在这里发现一个可以在循环中应用的模式。

【讨论】:

  • 谢谢,这正是我所需要的。我试试看!
  • @Joni 非常感谢;这有帮助。
【解决方案3】:

还记得 ASCII 码吗?

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

【讨论】:

  • 哎呀,实际上,现在我更仔细地阅读了您的帖子,我错了。我以为你想要一个字符串。参考其他人的正确答案。
  • 我认为你的意思是| 0x30,但+ '0' 会更清楚。
【解决方案4】:

都是整数。您不应该执行以下操作吗?

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

输出将是一个整数(不是字符串)

【讨论】:

  • 是的,我需要输出为 int。谢谢!
【解决方案5】:

你可以做的事情:

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

【讨论】:

  • -1 这很 C-ish。在 C++ 中返回分配有 new 的 C 风格字符串是非常危险的,因为调用者很可能会忘记删除该字符串,这会在调用数百万个函数时造成真的有问题的内存泄漏次。
  • @leftaroundabout : 不知道为什么你会因为代码是 C-ish 而否决它。提问者在问如何提高一个非常简单的功能的性能。我不会以这种方式编写应用程序,但对于一项家庭作业,我肯定会使用它。
  • 如果它一个简单而有效的性能提升,我就不会反对它。但是你的代码编译速度不会比任何体面的编译器使用std::vector/std::strings 更安全和更容易变体的速度更快。将其更改为使用这些,我会投票赞成。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 2021-03-29
  • 2020-08-29
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多