You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用char数组与std::string读取数据的性能差异及超时问题解析

编程题超时问题疑惑

我在解决一道编程题时,最初使用如下代码:

char result[50005][26], buffer[50005];
while (fin >> buffer) {
      for (int i = 0; i < strlen(buffer); ++i) {
          result[lin++][col] = buffer[i];
      }
      lin = 0;
      col++;
}

这段代码用于读取任意单词并存储字符,能正常运行但出现超时,仅得90分;将buffer从char数组改为std::string(同时替换strlen)后,顺利通过测试得100分。我无法理解两者的差异,疑惑是否char数组读取了50k缓冲区的多余字节?

原因解析
  • strlen的性能瓶颈:原代码中每次循环都调用strlen(buffer),这个函数需要从数组起始位置逐个遍历到终止符'\0'才能得到长度,时间复杂度是O(n)。如果测试用例中有大量长单词,累计的遍历操作会极大增加运行时间,导致超时。而std::string的size()或length()方法是直接返回内部维护的长度值,时间复杂度为O(1),完全没有遍历开销。
  • char数组并未读取多余字节:fin >> buffer的行为是跳过空白字符后,读取连续的非空白字符,直到遇到空白字符停止,最后自动在buffer末尾添加'\0'。它只会存储当前单词的字符加终止符,不会填充整个50005字节的缓冲区,所以不存在读取多余字节的情况。
  • 额外的安全性差异:char数组是固定大小,如果遇到长度超过50004的单词会触发缓冲区溢出(虽然题目测试用例可能没覆盖这种情况),而std::string会自动动态扩容,避免这类问题。

内容的提问来源于stack exchange,提问作者naphy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:45:56