2011-08-12 26 views

回答

3

1)是的,它是可變的。 operator []和at()都會返回字符的非常量引用,並且可以在左側使用:name[7] = 'X'name.at(7) = 'X'如果要進行邊界檢查。

2)更改單個字符的成本非常低:與C字符串非常接近或相同(加上邊界檢查的成本與at()。)雖然標準不要求,但所有實現std :: string將字符串存儲在連續的內存塊中(如果我能正確記住Meyers),那麼就地修改一個字符將是恆定的。

另請參閱boost string algorithms,它們通常提供流行字符串操作的副本和就地版本。

+1

該規範並不要求內部表示法是連續的,但它_does_要求'at'和'operator []'是恆定時間。 – Nemo

+1

使用C++ 0x時,連續性成爲'std :: string'實現的要求。 – pmr

+0

太棒了!感謝Nemo和pmr! – olooney

0

是的。

線性查找字符(但如果您已經知道索引,則爲常數)。如果你的問題假設字面上的含義,實際的替代是恆定的時間。如果您實際上是指整數的字符串表示形式,則替換點在替換點後的字符數將是線性的。

1

是的,您可以修改std::string的內容。

例如,使用std::string::operator[]

std::string str("foo"); 
str[0] = 'b'; 
std::cout << str << std::endl; 

將輸出"boo"

替換單個字符的成本是任何將字符複製到平臺上的內存位置成本。可能不多。

1

是的,它是可變的。

如果你的意思是這樣的:

std::string s("space\n"); 
int i = 'i'; 
s[2] = (char)i; 
std::cout << s; // prints 'spice' 

的細節是實現定義的,但第三個行一般包括:

  1. 負載從字符串的指針值
  2. 添加索引它
  3. 執行一個字節存儲到該地址

所以它很便宜。在調試模式下可能會出現邊界檢查等,並且可能還有其他代碼,但上述基本上是它必須做的。