C ++用<word contains =“”a =“”>替换<word a =“”>

时间:2015-04-27 06:53:18

标签: c++ c++11

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

想要像替换那样,但要成为一个无限循环。为什么呢?

2 个答案:

答案 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来避免这种情况。