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

Sou*_*wal 1 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;
    }
Run Code Online (Sandbox Code Playgroud)

声明1和声明2产生的输出应该相同但结果是不同的.怎么样和为什么?

raf*_*x07 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
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失败.

  • 恕我直言,这是OP正在寻找的答案.后续问题:当将`s [0]`作为左值传递时,引用是否真的无效?我认为它会继续引用第一个元素,它在语句2中第一个向字符串末尾移动后是'a'.这就是为什么声明2的结果是'aeefe'(至少在我的机器上). (2认同)