使用remove从字符串中删除字符实例问题



我在从字符串中删除字符的所有实例时遇到了一个问题。由于字符的删除是基于循环条件的,因此C++字符串函数擦除(或删除(产生的结果是不同的。看看代码:

int main()
{
string s="beabeefeab";
string s2=s;
cout<<"s[0] "<<s[0]<<endl;
s.erase(remove(s.begin(),s.end(),'b'),s.end());   //statement 1
cout<<s<<endl;
s=s2;
s.erase(remove(s.begin(),s.end(),s[0]),s.end());  //statement 2
cout<<s<<endl;
return 0;
}

语句1和语句2产生的输出应该相同,但结果不同。如何以及为什么?

如果我理解正确,您希望看到相同的输出字符串执行以下两个代码:

[1]
s = "beabeefeab";
s.erase(remove(s.begin(),s.end(),'b'),s.end());   //statement 1
cout << s << endl; // eaeefea
[2]
s = "beabeefeab";
s.erase(remove(s.begin(),s.end(),s[0]),s.end());  //statement 2
cout << s << endl; // should be eaeefea

您可以通过将s[0]强制转换为Rvalue-(char)s[0]来实现它。

去除算法的第三个参数是const T&。当您传递'b'时,Rvalue绑定到const char&,并且它对remove算法的整个执行有效。当您传递s[0]-Lvalue时,Lvalue绑定到algo的const char&参数,但在第一次移除操作时,引用指向的第一个项目的值发生了更改,移除algo失败。

使用第一次擦除/移除可以移除'b'。这将使s[0]等于'e'

然后将'e'传递给第二个擦除/移除,这意味着您也将其移除。

最新更新