使用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
相关产品推荐
相关产品推荐

