4

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

"      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。这里有什么问题?

4

2 回答 2

7

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

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

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

于 2011-07-11T04:32:46.863 回答
0

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

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

于 2012-12-25T07:29:14.273 回答