STL & remove 真正的删除元素

本文详细解析了C++ STL中的remove与erase函数的工作原理和使用方法,通过实例展示了如何利用remove+erase组合真正删除vector中指定值的所有元素,为读者提供了深入理解并正确运用这两个函数的实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

remove

① 查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素
② remove返回值 = “指向最后一个 ‘有用’ 元素的iterator”
③ remove并没有改变原容器的size,以及end(),并没有真正的删除元素

举例说明:
在这里插入图片描述

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
	//Lambda表达式:配合for_each,用于打印数组中的所有元素
	auto LmdPrint = [](int x)->void { cout << x << "  "; };

	vector<int> Numbers = { 1, 2, 1, 2, 2, 1, 3 };

	cout << "调用remove前:";
	for_each(Numbers.begin(), Numbers.end(), LmdPrint);
	
	//删除值为 2 的元素
	vector<int>::iterator ret = remove(Numbers.begin(), Numbers.end(), 2);

	cout << "\n调用remove后:";
	for_each(Numbers.begin(), Numbers.end(), LmdPrint);

	cout << "\n迭代器索引" << ret - Numbers.begin() << " = " << *ret << endl;

	system("pause");
}

erase函数介绍:

// 删除从first到last之间的所有元素
iterator erase(iterator first, iterator last);
条款32:remove+erase才能”真正的“删除vector中值为val的所有元素

    vec.erase(remove(vec.begin(), vec.end(), 待删除元素val , vec.end());

在 C++ STL 中,`forward_list` 是用于实现单向链表的容器,它提供了多种方法用于删除链表中的元素。由于单向链表的特性,删除操作需要特别注意如何定位和修改节点指针。 ### 删除特定值的所有匹配项 `forward_list` 提供了 `remove()` 成员函数,用于删除所有等于指定值的元素。此操作会遍历整个链表并删除符合条件的节点。 ```cpp #include &lt;iostream&gt; #include &lt;forward_list&gt; using namespace std; int main() { forward_list&lt;int&gt; fl = {1, 2, 3, 2, 4, 2}; fl.remove(2); // 删除所有值为 2 的元素 for (int val : fl) { cout &lt;&lt; val &lt;&lt; &quot; &quot;; } // 输出: 1 3 4 return 0; } ``` ### 根据条件删除元素 如果需要根据更复杂的条件删除元素,可以使用 `remove_if()` 方法,并传入一个谓词(predicate)来定义删除条件。 ```cpp fl.remove_if([](int x) { return x % 2 == 0; }); // 删除所有偶数 ``` ### 删除指定位置的元素 由于 `forward_list` 是单向链表,不支持随机访问迭代器,因此删除指定位置的元素需要通过迭代器操作。最常用的是删除某个迭代器指向的下一个元素,或者插入/删除操作在特定位置之前。 删除特定节点后的一个节点可以使用 `after_erase` 风格的迭代器操作: ```cpp auto prev = fl.before_begin(); // 获取头节点前的迭代器 auto curr = fl.begin(); while (curr != fl.end()) { if (*curr == 3) { // 删除值为 3 的节点 fl.erase_after(prev); // 删除 curr 所指向的节点 break; } prev = curr; ++curr; } ``` ### 删除所有元素 使用 `clear()` 方法可以删除链表中的所有元素: ```cpp fl.clear(); ``` ### 删除重复元素 如果链表中的元素是有序的,可以使用 `unique()` 方法删除连续的重复元素: ```cpp fl.unique(); // 删除连续重复的元素 ``` ### 总结 - `remove(value)` 用于删除所有等于 `value` 的元素。 - `remove_if(predicate)` 用于根据条件删除元素。 - `erase_after(iterator)` 用于删除指定位置之后的元素。 - `clear()` 用于清空整个链表。 - `unique()` 用于删除连续重复的元素[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值