void func(string &s, string const& oldVal, string const& newVal) //function to do the replace
{
while(s.find(oldVal) != string::npos) //keep finding
s.replace(s.find(oldVal), newVal.size(), newVal);
}
int main() //main function, test case
{
string s("tho");
func(s, "tho", "though");
cout << s << endl; // expected output: though.
}
想要像替换那样,但要成为一个无限循环。为什么呢?
答案 0 :(得分:3)
试试这样:
std::string& func(string &s, string const& oldVal, string const& newVal) //function to do the replace
{
size_t pos = 0, fpos;
while((fpos = s.find(oldVal, pos)) != string::npos) //keep finding
{
s.replace(fpos, newVal.size(), newVal);
pos = fpos + newVal.length();
}
return s;
}
答案 1 :(得分:0)
在C ++ 11(或使用Boost)中,您可以使用regex_replace:http://www.cplusplus.com/reference/regex/regex_replace/
这也应该具有更好的最坏情况复杂性,因为使用字符串替换的代码可能需要复制大量数据,例如:
thothothotho -> (copy 15 characters)
thoughthothotho -> (copy 12 characters)
thoughthoughthotho -> (copy 9 characters)
thoughthoughthoughtho -> (copy 6 characters)
thoughthoughthoughthough
=总共复制了42个字符以创建24个字符的字符串。在这个简单的例子中并没有那么糟糕,但正如你所看到的那样,副本的数量可能会呈二次方增长。
你也可以通过在一次传递中创建结果字符串而不是使用string :: replace来避免这种情况。