【问题标题】:How to remove whitespace in a sentence using remove command in C++?如何使用 C++ 中的删除命令删除句子中的空格?
【发布时间】:2011-07-11 04:29:35
【问题描述】:

我得到一个文件作为输入,我像这样读取第一行(引号标记开始和结束,但不在文件中):

"      1,     2.0,     3.0,     4.0                         "

当我像这样使用删除命令时:

    astring = line;
    cout << endl << "Before trim: " << line << endl;
    remove(astring.begin(), astring.end(), ' ');
    cout << endl << "After trim: " << astring << endl;

我得到的输出为:

1,2.0,3.0,4.02.0,    3.0,     4.0

我只需要1,2.0,3.0,4.0 的输出。这里有什么问题?

【问题讨论】:

  • 看起来像制表符。

标签: c++ string stl trim erase-remove-idiom


【解决方案1】:

std::remove 只是将所有未删除的元素在序列中向前移动;然后你需要截断底层容器,使用erase:

s.erase(std::remove(s.begin(), s.end(), ' '), s.end());

这称为erase-remove idiomremove 不能截断底层容器本身,因为它没有对容器的引用;它只有容器中元素的迭代器。

【讨论】:

  • 我不得不说,这是关于 C++ 标准库容器最奇怪的事情之一。
  • @Greg:是的,remove 这个名字不是很直观。一种看待它的方式是,对容器中元素的操作通常是非成员算法,但对容器本身的操作通常是容器类的成员函数。
【解决方案2】:

詹姆斯的回答是正确的,它为我节省了很多工作。 td::remove 只是将所有未删除的元素在序列中向前移动;然后,您需要使用擦除截断底层容器:

std.erase(std::remove(s.begin(), s.end(), ' '), s.end()); 这称为擦除删除习语。 remove 不能截断底层容器本身,因为它没有对容器的引用;它只有容器中元素的迭代器。

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2015-05-03
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多