std :: replace难度大

时间:2013-05-26 18:26:27

标签: c++ string stl replace

我还是STL的新手,想要用ch替换字符串中出现的所有k

我尝试了以下内容:

std::replace (str.begin(), str.end(), "ch", "k");

但它抛出了这个错误:

no matching function for call to ‘replace(__gnu_cxx::__normal_iterator<char*,
  std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
  __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>,
  std::allocator<char> > >, const char [2], const char [1])

在这种情况下如何让replace工作?

注意:我看到了一个类似的问题但在这种情况下,OP使用“blah”和“b”作为要替换的参数,但这里我的两个参数都是字符串。

3 个答案:

答案 0 :(得分:7)

由于std::replace的定义是

template< class It, class T >
void replace( It first, It last, const T& old_value, const T& new_value );

参考http://en.cppreference.com/w/cpp/algorithm/replace

您必须传递char,因为std::stringstd::basic_string<char>Tchar

例如:

std::replace (str.begin(), str.end(), 'c',  'k');

要解决您的问题,请阅读:How do I replace all instances of a string with another string?

答案 1 :(得分:3)

C ++标准库不包含像您在这里寻找的替换函数。替换是一种通用算法,可替换任何序列中所有出现的一个元素(是char s,int s或YourType s中的一个元素序列)和其他元素值。例如,它没有能力改变字符串的长度。 (怎么可能呢?改变字符串的大小需要调用string的成员函数,而replace没有对字符串的引用)

如果您需要这种替换,您可能需要考虑Boost String Algorithms库。

答案 2 :(得分:2)

错误消息非常明确:您需要使用char作为值,而不是c-strings。这意味着,不可能用一个替换2个字符。


如果要将字符串的子字符串替换为另一个字符串,可以使用this solution

void replaceAll(std::string& str, const std::string& from, const std::string& to) {
    if(from.empty())
        return;
    std::string::size_type start_pos = 0;
    while((start_pos = str.find(from, start_pos)) != std::string::npos) {
        str.replace(start_pos, from.length(), to);
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
    }
}