我的字符串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 > >)`
如何解决问题?
答案 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}}函数。
你必须重新排序你的论点。你这样做是错误的。
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