修改时是否复制C++中的字符串

Are strings in C++ copied when modified?

本文关键字:字符串 C++ 复制 是否 修改      更新时间:2023-10-16

使用C++中的std::string类,可以使用数组表示法修改字符,如:

std::string s = "Hello";
s[0] = 'X';
cout << s << 'n';

我已经检查了这段代码是否可以编译,并按预期打印"Xello"。然而,我想知道这个操作的成本是多少:它是恒定时间,还是因为字符串被复制而导致的O(n)?

字符串不会被复制。直接修改内部数据。

它基本上获取实际字符串内存的内部数据指针,并对其进行修改

char *data = &str[0];
for(size_t i = 0; i < str.size(); ++i)
{
data[i] = '!';
}

该代码将字符串中的每个字符都设置为感叹号。但是,如果字符串被复制,那么在第一次写入之后,数据指针将变为无效。

或者使用另一个示例:std::cout<lt;str[5]<lt;std::endl;

它打印字符串的第6个字符。为什么会复制字符串?C++无法区分char c = str[5]str[5] = c(除了常量和非常量函数调用)。

此外,str[n]保证永远不会抛出异常,只要n<str.size()。如果必须在内部为副本分配内存,它就无法保证这一点,因为分配可能会失败并引发。

(正如@juancopanza所提到的,旧的C++标准允许CoW字符串,但最新的C++标准禁止这样做)

您可以像您的示例一样修改stl字符串,不会进行复制。标准库字符串类不像其他语言(如Java)那样管理字符串池。这个操作的复杂性是恒定的。

您只修改了第一个元素s[0],因此它不可能是O(n)。你不会复制字符串。