remove 虚假删除
C++定义
template<class ForwardIterator, class T>
ForwardIterator remove(ForwardIterator first, ForwardIterator last,
const T& value);
作用
将容器中的所有值为 val 的元素扔到后面,并返回新的结尾位置
注意:
- remove(v.begin(), v.end(), 99); //remove有**返回值 , newEnd位置**
**
- 这是v在调用remove后看起来的样子**
解释:
用问号来标明那些在概念上已经从v中被删除,但继续存在的元素的值
事实上:
这是v在调用remove后真实中的样子’
remove删除过程讲解
删除过程图
实现过程
1. 双指针 i ,j,当 **i,j 相同**说明**不需要删除**,**指针同时向后移动**
1. 遇到要删除的元素,i 指针指着不动,j 继续向后遍历
- j 向后遍历遇到不需要删除的元素就和 i 交换,并且 i 后移一位,遇到要删除的不管
3. j 指针负责依次遍历,直至末尾结束,**i 指针就是newEnd位置,j 就是end位置**<br />
实例演示
vector<int> v; // 建立一个vector<int> 用1-10填充它
for (int i = 1; i <= 10; ++i) {
v.push_back(i);
}
v[3] = v[5] = v[9] = 99; // 设置3个元素为99
remove(v.begin(), v.end(), 99); // 删除所有等于99的元素
cout << v.size(); // 仍然是10
配合 erase 真正删除
作用
删除元素,并减小 vector 的大小
实例形式
iterator erase (iterator position); //指定删除元素的**位置
iterator erase (iterator first, iterator last); //这个删除的范围是左闭右开 **
例子演示
V.erase (V.begin()+2); // erase the 3th element 删除第3个元素
V.erase (V.begin(),V.begin()+3); // erase the first 3 elements: 删除前3个元素
真正删除演示
vector<int> v; // 建立一个vector<int> 用1-10填充它
for (int i = 1; i <= 10; ++i) {
v.push_back(i);
}
v[3] = v[5] = v[9] = 99; // 设置3个元素为99
V.erase(remove(v.begin(), v.end(), 99),V.end());