j00*_*0hi 17 c++ stl erase-remove-idiom
考虑以下代码(摘自cppreference.com,略有修改):
#include <algorithm>
#include <string>
#include <iostream>
#include <cctype>
int main()
{
std::string str1 = " Text with some spaces";
str1.erase(std::remove(str1.begin(), str1.end(), ' '), str1.end());
std::cout << str1 << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个参数是erase必需的?(str1.end()在这种情况下。)
为什么我不能只提供其返回的迭代器remove来erase?为什么我还必须告诉它要擦除的容器的最后一个元素?
这里的陷阱是,您也可以erase不使用第二个参数就进行调用,但是显然会产生错误的结果。
在某些情况下,我不想将容器的结尾作为第二个参数传递给erase?
省略“ erase删除-删除”习惯用法的第二个参数是否总是一个错误,或者这可能是一个有效的做法?
Pet*_*ker 18
std::remove返回一个迭代器;这是序列的新的过去式迭代器。但是,当序列由容器管理时,容器的大小没有改变。std::remove随机排列顺序中元素的顺序,但实际上并未删除其中的任何元素。
当然,要摆脱容器中不属于新序列的元素,请调用container.erase()。但目标是删除所有多余的元素;container.erase()仅使用一个迭代器进行调用会告诉它删除该元素。告诉container.erase()“从这里到最后”删除所有内容,你必须告诉它都在那里“这里”是哪里的到底是什么。因此,这意味着两个迭代器。
如果有帮助,请将“删除/擦除”成语视为两个单独的步骤:
auto new_end = std::remove(str1.begin(), str1.end(), ' ');
str1.erase(new_end, str1.end());
Run Code Online (Sandbox Code Playgroud)