Bootstrap

[C++] string类的字符串替换replace()方法及扩展应用详述

引言:

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;
}

 

 

;