C++ 删除函数向左移动字符

C++ remove function moving characters to the left

我最近尝试使用本网站某处提到的代码来删除字符串中的空格。答案建议从算法库中删除该函数(此处令人惊讶地解释:https://www.geeksforgeeks.org/stdremove-stdremove_if-c/)但它给出了意外的输出。它用一些随机数替换所有空格。这是代码。

#include <iostream>
#include <algorithm>
using namespace std;

int main() 
{
string a;
int b;
getline(cin, a);
remove(a.begin(), a.end(), ' ');
b = stoi(a);
cout << b << endl;
return 0;
}

例如,如果我输入 14 546 32,它会输出 145463232。奇怪的是,如果我输入 1 2 3 4 5,它会输出正确的结果:12345。

预期输出,输入:

我输入任意数字,其中一些数字之间有空格。

它输出没有空格的数字。

我试着用这个编译器在线编译它:https://www.onlinegdb.com/。它具有完全相同的输出。任何人都可以弄清楚代码有什么问题。而且我还需要将字符串转换为整数,然后再对整数进行一些数学运算(这就是我使用 stoi 函数的原因)。谢谢

关于 std::remove 的有趣之处在于它实际上并没有删除任何东西。 =)

您需要像这样自己擦除字符:

#include <iostream>
#include <algorithm>
using namespace std;

int main() 
{
    string a;
    int b;
    getline(cin, a);
    a.erase(remove(a.begin(), a.end(), ' '), a.end());
    b = stoi(a);
    cout << b << endl;
    return 0;
}

您可以在此处阅读有关擦除-删除的更多信息: https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom

std::remove 通过使用移动赋值移动剩余元素来删除比较等于其参数的元素。移动这些元素后它不会调整容器的大小。在您的例子中,由于对象的类型为 char,因此它们被简单地复制到数组的开头。所以你的字符串的结尾保持不变。

当您从第一个数字中删除 spaces,并将所有内容向左移动时,您会得到:

old string: 14 546 32
new string: 145463232

当你在第二种情况下做同样的事情时:

old string: 1 2 3 4 5
new string: 12345 4 5

你在第二个中得到正确结果的唯一原因是中间的 space。字符串中的第一个数字 (12345) 被转换为 int 并返回。

请注意 std::remove 也是 returns 到列表的新 end 的迭代器。您可以使用它来调整字符串的大小。

auto end = remove(a.begin(), a.end(), ' ');
a.resize(end - a.begin());