字符串擦除使用反向remove_if

时间:2017-12-16 16:21:34

标签: c++ c++14

我的字符串s =“12300”,现在我试图删除尾部的0。 所以我在努力:

s.erase(s.rbegin(), std::remove_if(s.rbegin(), res.rend(),
                                  [](unsigned char x){
                                      static bool isPrevSymbol0 = true;
                                      if(!isPrevSymbol0)
                                      {
                                          return false;
                                      }
                                      isPrevSymbol0 = (x=='0');

                                      return isPrevSymbol0;
                                  }));

我收到了这个错误:

no matching function for call to `std::basic_string::erase(std::basic_string::reverse_iterator, std::reverse_iterator<__gnu_cxx::__normal_iterator > >)`

如何解决问题?

4 个答案:

答案 0 :(得分:2)

这只是因为std::string::erase接受const_iterator,它不需要反向迭代器。没有有效的超载。

您需要通过base()将迭代器从反向迭代器显式转换为前向迭代器。我们可以通过从最后找到第一个非0字符并从那里删除来更直接地做到这一点:

auto last_non_zero = std::find_if(s.rbegin(), s.rend(), [](char c){ return c != '0'; });
s.erase(last_non_zero.base(), s.end());
//                   ^^^^^^^

答案 1 :(得分:2)

basic_string 150多个成员函数经常被嘲笑,但由于它们在那里,让我们好好利用它们:

s.erase(s.find_last_not_of('0') + 1);

答案 2 :(得分:0)

似乎反向迭代器将坏字符移动到字符串的开头(而不是结尾)并返回我们需要保留字符的位置。

因此您需要从字符串的开头擦除remove_if返回的值。

std::string s = "12300";

s.erase(s.begin(), std::remove_if(s.rbegin(), s.rend(), [](char x){

    static bool isPrevSymbol0 = true;

    if(!isPrevSymbol0)
        return false;

    isPrevSymbol0 = (x=='0');

    return isPrevSymbol0;
}).base());

std::cout << s << '\n';

另请注意,我们需要使用base()将返回的反向迭代器转换为相应的常规迭代器。

答案 3 :(得分:-2)

reverse_iterator不是普通的迭代器。您必须使用base()函数才能使用erase()的{​​{1}}函数。 你必须重新排序你的论点。你这样做是错误的。

look here

std::string

编辑:我认为你的代码根本不正确。 std::string s="12300"; s.erase(std::remove_if(s.rbegin(), s.rend(), [](unsigned char x){ static bool isPrevSymbol0 = true; if(!isPrevSymbol0) { return false; } isPrevSymbol0 = (x=='0'); return isPrevSymbol0; }).base(), s.end()); std::cout << s; 在第一次返回std::remove_if时没有中断。我认为这是一项错误的算法。

false