удалить экземпляр символа из строковой проблемы с помощью remove - PullRequest
0 голосов
/ 08 ноября 2018

Я столкнулся с проблемой удаления всех экземпляров символа из строки. Поскольку удаление символов основано на условии цикла, результаты, полученные с помощью функции стирания (или удаления) 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 голосов
/ 08 ноября 2018

Если я правильно понимаю, вы хотите видеть одну и ту же строку вывода, выполняющую два приведенных ниже кода:

[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 algo. Когда вы передаете s[0] - Lvalue, Lvalue связывается с const char& параметром algo, но при первой операции удаления значение первого элемента, на которое указывает ссылка, изменяется, и удаление алгоритма завершается неудачей.

0 голосов
/ 08 ноября 2018

При первом стирании / удалении вы удаляете 'b'. Это оставит s[0] равным 'e'.

Затем вы передаете это 'e' второму стиранию / удалению, что означает, что вы тоже удаляете его.

...