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

博客介绍了C++的string库中字符串替换函数string.replace(),该函数只能替换一次。在C++11标准中介绍了其常用原型,还提到泛型算法replace的复杂度为O(n)。此外,由于string库未提供全量替换函数,给出了自己编写实现的代码,这在实际项目中很有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言:

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值