我在从字符串中删除字符的所有实例时遇到问题.由于字符的删除基于循环条件,因此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;
}
Run Code Online (Sandbox Code Playgroud)
声明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
Run Code Online (Sandbox Code Playgroud)
你可以通过施放s[0]到Rvalue 来实现它- (char)s[0].
删除算法的第三个参数是const T&.当你传递时'b'- Rvalue被绑定 const char&并且它对于remove算法的整个执行是有效的.当你传递s[0]Lvalue时,Lvalue被绑定到const char&algo的参数,但是在第一次删除操作时,引用指向的第一个项的值被更改,并且remove algo失败.