我还是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”作为要替换的参数,但这里我的两个参数都是字符串。
答案 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::string
为std::basic_string<char>
且T
为char
。
例如:
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'
}
}