在C ++中使用std :: string类,可以使用数组表示法修改字符,如:
std::string s = "Hello";
s[0] = 'X';
cout << s << '\n';
我已检查此代码是否已编译,并按预期打印“Xello”。但是,我想知道这个操作的成本是多少:它是恒定时间,还是O(n),因为字符串被复制了?
答案 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)。你不要复制字符串。