remove 虚假删除

C++定义

  1. template<class ForwardIterator, class T>
  2. ForwardIterator remove(ForwardIterator first, ForwardIterator last,
  3. const T& value);

作用

将容器中的所有值为 val 的元素扔到后面,并返回新的结尾位置
注意:

  1. remove并不是真真的删除,容器长度不会发生改变
  2. 真正的删除通常需要配合erase使用

    举事例说明

  3. 这是v在调用remove前看起来的样子

如何在Vector中删除元素? - 图1

  1. remove(v.begin(), v.end(), 99); //remove有**返回值 newEnd位置**

**

  1. 这是v在调用remove后看起来的样子**如何在Vector中删除元素? - 图2

解释:
用问号来标明那些在概念上已经从v中被删除但继续存在的元素的值

事实上:
这是v在调用remove后真实中的样子
如何在Vector中删除元素? - 图3

remove删除过程讲解

删除过程图
如何在Vector中删除元素? - 图4
实现过程

  1. 1. 双指针 i j,当 **ij 相同**说明**不需要删除**,**指针同时向后移动**
  2. 1. 遇到要删除的元素,i 指针指着不动,j 继续向后遍历
  3. - j 向后遍历遇到不需要删除的元素就和 i 交换,并且 i 后移一位,遇到要删除的不管
  4. 3. j 指针负责依次遍历,直至末尾结束,**i 指针就是newEnd位置,j 就是end位置**<br />

实例演示

  1. vector<int> v; // 建立一个vector<int> 用1-10填充它
  2. for (int i = 1; i <= 10; ++i) {
  3. v.push_back(i);
  4. }
  5. v[3] = v[5] = v[9] = 99; // 设置3个元素为99
  6. remove(v.begin(), v.end(), 99); // 删除所有等于99的元素
  7. cout << v.size(); // 仍然是10

配合 erase 真正删除

作用

删除元素,并减小 vector 的大小

实例形式

iterator erase (iterator position); //指定删除元素的**位置
iterator erase (iterator first, iterator last); //这个删除的范围是左闭右开 **

例子演示

  1. V.erase (V.begin()+2); // erase the 3th element 删除第3个元素
  2. V.erase (V.begin(),V.begin()+3); // erase the first 3 elements: 删除前3个元素

真正删除演示

  1. vector<int> v; // 建立一个vector<int> 用1-10填充它
  2. for (int i = 1; i <= 10; ++i) {
  3. v.push_back(i);
  4. }
  5. v[3] = v[5] = v[9] = 99; // 设置3个元素为99
  6. V.erase(remove(v.begin(), v.end(), 99),V.end());