我在从字符串中删除字符的所有实例时遇到问题。由于删除字符是基于循环条件的,因此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产生的输出应该相同,但结果却不同。如何以及为什么?
答案 0 :(得分:6)
如果我正确理解,您希望看到执行以下两个代码的相同输出字符串:
[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绑定到算法的const char&
参数,但是在第一次删除操作时,引用所指向的第一项的值会更改,并且删除算法会失败。
答案 1 :(得分:0)
在第一次擦除/删除操作中,您删除了'b'
。这样将使s[0]
等于'e'
。
然后,您将'e'
传递到第二个擦除/删除操作,这也意味着您也将其删除。