8.11.3 访问与修改字符串(1)
可以使用下标操作符[]来访问string对象中的任何字符,从而读取或重写它。举例如下:
- string sentence("Too many cooks spoil the broth.");
- for(size_t i = 0; i < sentence.length(); i++)
- {
- if(' ' == sentence[i])
- sentence[i] = '*';
- }
这段代码依次检查sentence字符串中的每个字符,看看它是否为空格,如果是,则用星号替换该字符。
用at()成员函数与用[]操作符得到的结果相同:
- string sentence("Too many cooks spoil the broth.");
- for(size_t i = 0; i < sentence.length(); i++)
- {
- if(' ' == sentence.at(i))
- sentence.at(i) = '*';
- }
这段代码与上一段代码的功能完全相同,那么使用[]与使用at()的区别在哪里呢?利用下标值的速度比使用at()函数快,但缺点是没有检查索引的有效性。如果索引超出了范围,那么使用下标操作符的结果将不确定。另一方面,at()函数稍微慢一点儿,但它会检查索引的有效性,如果索引无效,该函数就会抛出一个out_of_range异常。当索引值有可能超出范围时,可以使用at()函数,在这种情况下把代码放在try块中,并恰当地处理异常。如果我们能确信不会出现索引超出范围的情况,就使用[]操作符。
可以对字符串对象使用基于范围的for循环,迭代字符串中的所有字符:
- string sentence("Too many cooks spoil the broth.");
- for(auto& ch : sentence)
- {
- if(' ' == ch)
- ch = '*';
- }
这段代码也用星号替换空格,就像前面的循环一样,但这段代码要简单得多。对ch使用引用类型就可以修改字符串。
可以提取现有string对象的一部分作为一个新的string对象。例如:
- string sentence("Too many cooks spoil the broth.");
- string substring = sentence.substr(4, 10); // Extracts "many cooks"
substr()函数的第一个实参是要提取的子字符串的第一个字符,第二个实参是子字符串中的字符个数。
使用字符串对象的append()函数,可以在字符串末尾添加一个或多个字符。该函数有几个版本;包括向调用该函数的对象附加一个或多个给定字符、一个字符串字面值或者一个string对象。例如:
- string phrase("The higher");
- string word("fewer");
- phrase.append(1, ' '); // Append one space
- phrase.append("the "); // Append a string literal
- phrase.append(word); // Append a string object
- phrase.append(2, '!'); // Append two exclamation marks
当执行这个代码序列后,phrase将修改为"The higher the fewer!!"。使用带两个实参的append()版本时,第一个实参是将被附加第二个实参指定的字符的次数。当调用append()函数时,它返回对调用该函数的对象的引用,因此可以在一个语句中写出上面4个append()调用:
- phrase.append(1, ' ').append("the ").append(word).append(2, '!');
也可以用append()将字符串字面值的一部分或string对象的一部分附加到一个现有字符串后面:
- string phrase("The more the merrier.");
- string query("Any");
- query.append(phrase, 3, 5).append(1, ' ');