引言:
C++的string库提供了专门的函数方法来实现字符串的替换:string.replace()
但是这个函数将源字符串中某个字符串只替换了一次,string类并没有实现对于源字符串中的某个字符串全部替换。介绍:
在C++11标准中string::replace的原型有下面几种,但是常用的就前面3种,因此理解掌握前3种即可。
实践:
replace函数包含于头文件#include<string>中。
泛型算法replace把队列中与给定值相等的所有值替换为另一个值,整个队列都被扫描,即此算法的各个版本都在线性时间内执行----其复杂度为O(n)。即replace的执行要遍历由区间[frist,last)限定的整个队列,以把 old_value 替换成 new_value
前3种的代码操作如下,每份代码前将其函数原型和参数含义给出方便理解。
/* 用法一: * string& replace (size_t pos, size_t len, const string& str); * 源字符串中从位置 pos 开始长度为 len 的字符串 被字符串 str 代替 * * 功能:只替换一次 */ int main() { string str_line("I love compile program with visual studio."); cout << str_line.replace(str_line.find('e'), 1, "#") << endl; // 答案: I lov# compile program with visual studio. return 0; }
/* 用法二: * string& replace (const_iterator i1, const_iterator i2, const string& str); * 用 str 替换 迭代器起始位置 和 结束位置 之间的字符 * * 功能:替换一段字符串 */ int main() { string str_line("I love compile program with visual studio."); // 用 str 替换 从begin位置开始的6个字符 cout << str_line.replace(str_line.begin(), str_line.begin()+6, "**")<< endl; // 答案:** compile program with visual studio. return 0; }
/* 用法三: * string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen); * 源串指定位置上的子串(pos开始len长度)被替换为 str 的指定子串(给定起始位置和长度) */ int main() { string str_line("I love compile program with visual studio."); string substr = "12345"; cout << str_line.replace(7, 7, substr, substr.find("2"), 3) << endl; // 答案:I love 234 program with visual studio. return 0; }
但是,偶尔的时候需要将源字符串中的某个字符(或某段子串)全部替换,而string库中未提供相关的库函数,这就需要我们自己进行编写实现。这种情况在实际项目中经常遇见,学会自己编写这类函数有利于自身发展。代码如下:
/* 编写函数: * string& replace_all (string& src, const string& old_value, const string& new_value); * 参数:源字符串src 被替换的子串old_value 替换的子串new_value * * 功能:将 源串src 中 子串old_value 全部被替换为 new_value */ string& replace_all(string& src, const string& old_value, const string& new_value) { // 每次重新定位起始位置,防止上轮替换后的字符串形成新的old_value for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) { if ((pos = src.find(old_value, pos)) != string::npos) { src.replace(pos, old_value.length(), new_value); } else break; } return src; } int main() { string str("I love compile program with visual studio."); cout << replace_all(str, "o", "*0*") << endl; // 答案:I l*0*ve c*0*mpile pr*0*gram with visual studi*0*. return 0; }