跳转到内容

更多 C++ 惯用法/Erase-Remove

来自 Wikibooks,开放世界中的开放书籍

Erase-Remove

[编辑 | 编辑源代码]

从 STL 容器中消除元素,以减小其大小。

也称为

[编辑 | 编辑源代码]

Remove-Erase(基于执行顺序,而不是源代码行上的类型化顺序)

std::remove 算法不会从容器中消除元素;它只是将未被移除的元素移动到容器的开头,并将容器末尾的内容保留为未定义。这是因为 std::remove 算法仅使用一对正向迭代器(迭代器对 惯用法)工作,而正向迭代器的通用概念不知道如何从任意数据结构中消除数据元素。只有容器成员函数可以消除容器元素,因为只有成员函数知道内部数据结构的详细信息。Erase-Remove 惯用法用于从容器中删除和消除数据元素。

解决方案和示例代码

[编辑 | 编辑源代码]

std::remove 算法返回一个指向“未使用”元素范围开头的迭代器。它不会更改容器的 end() 迭代器,也不会更改容器的大小。erase() 成员函数可用于以下惯用法方式真正从容器中消除成员。

template<typename T>
inline void remove(std::vector<T> & v, const T & item)
{
    // Be careful: if you omit the v.end() parameter to v.erase, the
    // code will compile but only a single item will be removed.
    v.erase(std::remove(v.begin(), v.end(), item), v.end());
}


std::vector<int> v;
// Fill it up somehow
remove(v, 99); // Really remove all elements with value 99

此处 v.end() 的评估顺序和 std::remove 的调用无关紧要,因为 std::remove 算法不会以任何方式更改 end() 迭代器。

已知用途

[编辑 | 编辑源代码]

https://boost.ac.cn/doc/libs/1_43_0/libs/range/doc/html/range/reference/algorithms/new/remove_erase.html

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]

Effective STL,第 32 项 - Scott Meyers

华夏公益教科书