C++ primer 第五版 中文版 练习 9.43
题目:编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。
测试你的程序,用它替换通用的简写形式,如,将"tho"替换为"though",将"thru"替换为“through”。
答:
看到这个题目马上想到了用 for跟下标来逐个比较然后替换,但题目要求用 迭代器来实现,马上感觉自己智商余额不足,也不知道是由于受C中数组的影响还是真的智商余额不足……就是用迭代器完成不了,于是乎在 github上找到了一个相关代码如下:
链接:https://github.com/Mooophy/Cpp-Primer/blob/master/ch09/ex9_43.cpp
思路是用substr来生成跟oldVal长度相等的子串,然后比较,相等就把oldVal删除,把newVal插入,然后设置迭代器位置,重新比较。
测试代码如下:以下代码有对源代码的修改,把比较的语句改为了 == 比较,因为在这个练习的时候 compare函数还没有学习到。
/*
编写一个函数,接受三个string参数s、oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。
测试你的程序,用它替换通用的简写形式,如,将"tho"替换为"though",将"thru"替换为“through”。
*/
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
void find_replace(string &s, const string &oldVal, const string &newVal)
{
if (s.empty()||oldVal.empty()||newVal.empty())
{
cout << "s or oldVal or newVal字符串为空,请检查" << endl;
return;
}
if (s.size() < oldVal.size())
{
cout << "目标字符串长度小于要查找的字符串" << endl;
return;
}
string::iterator iter = s.begin();
string substring;
while (iter != s.end())
{
if (*iter == *oldVal.begin())
{
substring = s.substr(iter - s.begin(), oldVal.size());
if (substring == oldVal)
{
unsigned offSet = iter - s.begin();
iter = s.erase(iter, iter + oldVal.size());
s.insert(iter, newVal.begin(), newVal.end());
iter = s.begin() + offSet + oldVal.size() - 1;
}
}
else
{
++iter;
}
}
}
int main()
{
string str = { "mtho my C++ tho,Primer" };
string oldVal ("tho"), newVal ("though");
cout << "替换前的字符串为:" << str << endl;
find_replace(str, oldVal, newVal);
cout <<"替换后的字符串为:"<< str << endl;
return 0;
}
执行结果: