原題:編寫一個函數(shù)聂薪,接受三個string參數(shù)s、oldVal和newVal娜汁。使用迭代器及insert和erase函數(shù)將s中所有oldVal替換為newVal筏养。 測試你的程序奶卓,用它替換通用的簡寫形式,如撼玄,將tho替換為though,將thru替換為“through”墩邀。
網(wǎng)上搜到了一個使用 substr() 的答案掌猛,感覺原題里這個條件“使用迭代器、insert眉睹、erase” 是不允許使用其他函數(shù)的荔茬。
void replaceString(std::string &s, const std::string &oldVal, const std::string &newVal){
if (oldVal.empty() || s.empty()){
return;
}
if (s.size() < oldVal.size()){
return;
}
auto sIter = s.begin();
auto oldIter = oldVal.begin();
while (sIter != s.end()){
if ((*sIter) == (*oldIter)){
++oldIter;
}else {
oldIter = oldVal.begin();
}
++sIter;
if (oldIter == oldVal.end()){
oldIter = oldVal.begin();
sIter = s.erase(sIter - oldVal.size(), sIter);
for (std::string::size_type index = 0; index < newVal.size(); ++index){
sIter = s.insert(sIter, newVal[index]);
++sIter;
}
}
}
}
還有 9.44 使用下標和 replace 的版本
void replaceString(std::string &s, const std::string &oldVal, const std::string &newVal){
if (oldVal.empty() || s.empty()){
return;
}
if (s.size() < oldVal.size()){
return;
}
std::string::size_type sIndex = 0;
std::string::size_type oldIndex = 0;
while (sIndex < s.size()){
if (oldVal[oldIndex] == s[sIndex]){
++oldIndex;
}else {
oldIndex = 0;
}
++sIndex;
if (oldIndex >= oldVal.size()){
oldIndex = 0;
s.replace(sIndex - oldVal.size(), oldVal.size(), newVal);
sIndex += newVal.size() - oldVal.size();
}
}
}