从 std::vector
或其他容器中删除具有特定属性的元素的任务适合使用函数式风格的实现:为什么要费心用循环, 内存释放和正确地移动数据?
然而,在 C++ 中标准的做法似乎是使用以下惯用语:
std::vector<int> ints;
...
ints.erase(
std::remove_if(ints.begin(),
ints.end(),
[](int x){return x < 0;}),
ints.end());
这个例子从整数向量中删除所有小于零的元素。
我认为这不仅难看,而且容易被错误使用。很明显,std::remove_if
不能改变向量的大小(正如它的名称所暗示的那样),因为它只接受迭代器作为参数。但是,包括我在内的许多开发人员一开始并没有理解这一点。
那么有没有更安全、更优雅的方法来实现这一点呢?如果没有,为什么?