修改后是否复制了C ++中的字符串?

时间:2014-01-13 08:26:22

标签: c++ string

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

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

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

3 个答案:

答案 0 :(得分:1)

您可以像修改示例中那样修改stl字符串,不会执行任何复制。标准库字符串类不像其他语言那样管理字符串池(如Java)。此操作的复杂性不变。

答案 1 :(得分:0)

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

它基本上获取实际字符串内存的内部数据指针,并对其进行修改。想象一下这样做:

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

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

或者使用另一个例子:    std :: cout&lt;&lt; str [5]&lt;&lt;的std :: ENDL;

打印字符串的第6个字符。为什么复制字符串? C ++无法区分char c = str[5]str[5] = c之间的区别(除了const与非const函数调用之外)。

此外,只要n

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

答案 2 :(得分:0)

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