← 模式
从容器中移除元素
1234567891011121314 | #include <vector> #include <algorithm> int main() { std::vector<int> v = {1, 2, 3, 4, 2, 5, 2, 6 |
此模式采用 CC0 公共领域贡献 许可。
需要 c++11 或更新版本。
意图
使用 erase-remove 惯用法从容器中移除元素。
描述
在第 6 行,我们创建了一个 std::vector
作为示例容器,并用一些 int
元素对其进行初始化。
std::remove
和 std::remove_if
算法并不知道给定范围的底层存储结构,因此无法真正从该存储中移除元素。相反,这些算法实际上会移动(通过移动赋值的方式)范围中的元素,使得未被移除的元素在原始范围的开头形成一个新的范围。这些算法会返回一个指向这个新范围尾部的迭代器,由于被移除的元素已被移动到原始范围的末尾,这个迭代器也标记了被移除元素的起始位置。
在第 8-9 行,我们展示了如何将返回的迭代器传递给容器的 erase
成员函数,该函数会真正地从容器中移除元素。类似地,在第 11-13 行,我们演示了如何将 std::remove_if
与 erase
结合使用,以移除所有使得给定谓词返回 true
的元素(在示例代码中,我们移除了所有偶数元素)。
这种先使用通用 remove 算法,然后调用特定容器的 erase
成员函数的技术,通常被称为 erase-remove 惯用法。