c++ - 算法和算法性能的缺陷

标签 c++ string algorithm memory-management

char *stringmult(int n)
{
    char *x = "hello ";
    for (int i=0; i<n; ++i)
    {
        char *y = new char[strlen(x) * 2];
        strcpy(y,x);
        strcat(y,x);
        delete[] x;
        x=y;
    }
    return x;
}

我想弄清楚这个部分的缺陷是什么。首先,它删除 x,然后尝试将其值复制到 y。另一个是 y 的大小是 x 的两倍,并且 y 永远不会被删除。有什么我想念的吗?而且,我需要弄清楚如何获得算法性能。如果您有一个快速链接,您可以在其中学习如何操作,我将不胜感激。

最佳答案

y 需要比 strlen(x) * 2 多一个字节来为终止 nul 字符腾出空间——仅供初学者使用。

无论如何,当您返回一个新的内存区域时,是否删除它取决于调用者 (eek)。

在我看来,你缺少的是 std::string...!-)

至于性能,用strcpy复制N个字符是O(N);将 N1 个字符连接到具有 N2 的前一个 strlen 的 char 数组是 O(N1+N2)(std::string 更快,因为它将字符串的长度保持在 O(1) 可访问属性中!-)。因此,只需将 N 的 N+N**2 求和到您感兴趣的极限(如果您想要的只是一个大 O 估计,您可以忽略 N+ 部分,因为它显然会消失对于越来越大的 N!- 值)。

关于c++ - 算法和算法性能的缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096312/

相关文章:

algorithm - 在大词流中查找前 K 个频繁词

c++ - 如何使用密码而不是 openssl 库中的 key 和 iv 通过 AES-256-CBC 加密文件?

c++ - NTL 将 ZZX 转换为 ZZ_pEX

java - 如何获取字符串数组中的数字并将它们放入 int 数组中

image - 如果模糊算法已知,图像上的模糊可以逆转吗?

c - 这个冒泡排序怎么这么快?

c++ - 为什么 "extern int &c;"工作正常?

c++ - QXmlStreamWriter,命名空间和前缀

c++ - 转义 C++ 字符串

javascript - 在字符串中的每个字符串实例之后插入一个空格