← 模式

从容器中移除元素

1234567891011121314#include <vector> #include <algorithm> int main() { std::vector<int> v = {1, 2, 3, 4, 2, 5, 2, 6}; v.erase(std::remove(std::begin(v), std::end(v), 2), std::end(v)); v.erase(std::remove_if(std::begin(v), std::end(v), [](int i) { return i%2 == 0; }), std::end(v)); }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

使用 erase-remove 惯用法从容器中移除元素。

描述

第 6 行,我们创建了一个 std::vector 作为示例容器,并用一些 int 元素对其进行初始化。

std::removestd::remove_if 算法并不知道给定范围的底层存储结构,因此无法真正从该存储中移除元素。相反,这些算法实际上会移动(通过移动赋值的方式)范围中的元素,使得未被移除的元素在原始范围的开头形成一个新的范围。这些算法会返回一个指向这个新范围尾部的迭代器,由于被移除的元素已被移动到原始范围的末尾,这个迭代器也标记了被移除元素的起始位置。

第 8-9 行,我们展示了如何将返回的迭代器传递给容器的 erase 成员函数,该函数会真正地从容器中移除元素。类似地,在第 11-13 行,我们演示了如何将 std::remove_iferase 结合使用,以移除所有使得给定谓词返回 true 的元素(在示例代码中,我们移除了所有偶数元素)。

这种先使用通用 remove 算法,然后调用特定容器的 erase 成员函数的技术,通常被称为 erase-remove 惯用法。

贡献者

  • Joseph Mansfield
  • ilpropheta

最后更新

2017年12月10日

来源

在 GitHub 上 Fork 此模式

分享