要替换的字符串中的replace_if

时间:2017-05-19 16:58:15

标签: c++ string c++11 lambda

我使用replace_if解决了一个简单的问题,但每次它都给我错误。 的问题
在给定的字符串中删除相邻的字符并使字符串尽可能紧凑 例如: aabcc将成为b,aabbcc将变为空字符串。

int main()
{
    string s;
    cin>>s;    
    replace_if(s.begin(),s.end(),[](char l, char r){return l == r;},"");
    cout << string(s.begin(),s.end());   
    return 0;
}

错误:

/usr/include/c++/6/bits/stl_algo.h:4280:12: note:   candidate expects 3 arguments, 2 provided  
solution.cc:19:51: note: candidate:  
main()::<lambda(char, char)> 
replace_if(s.begin(),s.end(),[](char l, char r){

1 个答案:

答案 0 :(得分:4)

std::replace_if对某个类型的值(在您的情况下,类型为char)进行操作,并且可用于检查序列中的每个值,并可能将其替换为另一个值相同类型。换句话说,如果允许您将所有a替换为b s,但不允许删除元素或将谓词基于被检查元素本身以上。

你需要的是构图有点复杂,但可以做到,例如像这样:

auto it = s.begin();
for (;;)
{
  it = std::adjacent_find(it, s.end()); // Find two adjacent same characters
  if (it == s.end()) // If there are none, we're done
    break;
  auto next = std::find_if(it, s.end(), [it](char c) { return c != *it; }); // Find next different character
  it = s.erase(it, next); // Erase all in range [it, next)
}