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

时间:2018-11-08 09:18:10

标签: c++ c++14

我在从字符串中删除字符的所有实例时遇到问题。由于删除字符是基于循环条件的,因此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产生的输出应该相同,但结果却不同。如何以及为什么?

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'传递到第二个擦除/删除操作,这也意味着您也将其删除。