erase-remove idiom介绍
如下代码:
lists.erase(remove_if(lists.begin(), lists.end(), [] (auto p) { return !p; }), lists.end());
lists是一个vector类型的变量。
里面关键要注意的:
remove_if
实际不会移除元素
remove_if
并不会真正删除容器中的元素,而是:
-
重排容器内元素,把符合条件的元素移到后面;
-
返回一个迭代器
new_end
,指向“逻辑上”末尾的位置(即要删的元素开始处)。
也就是说,remove_if
只是**“标记要删的元素”,并把它们挪到末尾,但并不真正删掉**。
所以上面代码的意思:
-
remove_if
: 把nullptr
元素移到末尾,并返回“第一个nullptr
”的位置; -
erase
: 从这个位置开始删掉所有nullptr
元素。
注意:这个惯用法不适用于 std::list
因为 std::list
有自带的 .remove_if()
,它会直接删除元素,不需要配合 erase
。但 std::vector
不行,必须两步。