【发布时间】:2016-07-22 22:15:20
【问题描述】:
从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 无法更改向量的大小(正如其名称所暗示的那样),因为它只会传递迭代器。但包括我自己在内的许多开发人员一开始并没有意识到这一点。
那么有没有一种更安全、更有希望更优雅的方法来实现这一点?如果不是,为什么?
【问题讨论】:
-
与往常一样,如果它变得复杂,请将其包装在(模板)函数中。
-
@KarolyHorvath:是的,但这是一项很常见的任务。我不想为它编写自己的函数。这属于标准库,就像其他语言一样。
-
是的,当然,祈祷或写一份提案,然后等待几年。 掌心.
-
@KarolyHorvath:好吧,在堆栈溢出问题上提出这个问题可能只是第一步。我会说比祈祷更好。
-
将discard_space() 或remove_space() 添加到C++ 中的字符串类会不会很好?这将为集体 C++ 程序员节省 100 年的时间(浪费)。
标签: c++ c++11 stl c++17 erase-remove-idiom