📜  如何使用Erase()和reverse_iterator从向量中擦除元素?(1)

📅  最后修改于: 2023-12-03 15:23:58.449000             🧑  作者: Mango

如何使用Erase()和reverse_iterator从向量中擦除元素?

在C++中,向量是一种非常有用的数据结构,在许多情况下被用来代替数组。一个向量是由一些元素组成的序列,它们可以按照添加的顺序存储,非常类似于数组。在本篇文章中,我们将讨论如何使用Erase()和reverse_iterator从向量中擦除元素。

std::vector介绍

在C++中,向量是由一些元素组成的连续序列,这些元素可以用push_back()或者insert()方法添加到末尾或者指定位置。向量中的元素可以通过下标或者迭代器来访问。要声明一个向量变量,我们可以使用以下语法:

std::vector<int> myVector;

这将声明一个空的向量,它可以存放int类型的元素。也可以使用以下语法声明向量:

std::vector<int> myVector(10); // 其中10是向量的大小

这将声明一个大小为10的向量,其中所有元素都是0。如果需要的话,我们可以使用resize()方法更改向量的大小。

使用Erase()删除元素

Erase()方法用于删除向量中的一个或多个元素。它需要一个迭代器作为参数,该迭代器指向要删除的第一个元素。有以下两个版本的Erase()方法:

iterator erase( const_iterator pos ); // 删除一个元素
iterator erase( const_iterator first, const_iterator last ); // 删除一段元素

如果我们要删除一个元素,可以使用以下代码:

myVector.erase(myVector.begin() + 3); // 删除第四个元素

如果要删除一段元素,可以使用以下代码:

myVector.erase(myVector.begin() + 3, myVector.begin() + 6); // 删除第4、第5、第6个元素
使用reverse_iterator删除元素

reverse_iterator是一个反向迭代器,它可以从向量的末尾开始遍历元素。如果我们想从向量的末尾开始删除元素,可以使用rbegin()函数和erase()函数的reverse_iterator版本。以下是删除最后一个元素的示例代码:

myVector.erase(myVector.rbegin().base() + 1); // 删除最后一个元素

在这里,rbegin()返回反向迭代器,例如指向最后一个元素。然后,我们调用base()方法来从反向迭代器中获取正向迭代器,最后减去1来获得指向倒数第二个元素。此操作将删除最后一个元素。

示例代码
#include <iostream>
#include <vector>

int main()
{
  std::vector<int> myVector = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  // 遍历向量并擦除所有的偶数
  for (auto it = myVector.begin(); it != myVector.end();)
  {
    if (*it % 2 == 0)
    {
      it = myVector.erase(it);
    }
    else
    {
      ++it;
    }
  }

  for (auto i : myVector)
  {
    std::cout << i << " ";
  }
  std::cout << std::endl;
  
  // 按照逆序遍历向量并擦除前三个元素
  for (auto it = myVector.rbegin(); it != myVector.rbegin() + 3; ++it)
  {
    myVector.erase((it + 1).base()); // 注意此处的+1操作
  }

  for (auto i : myVector)
  {
    std::cout << i << " ";
  }
  std::cout << std::endl;

  return 0;
}

以上代码将输出:

1 3 5 7 9
7 9
总结

Erase()方法和reverse_iterator是在向量中擦除元素非常有用的工具。要保证程序正确性,我们需要清楚迭代器的操作,以及如何使用迭代器来遍历向量并删除其中的元素。为了避免不必要的复杂性,我们可以通过以下简单的策略来保证向量的正确性:

  1. 不要在循环内调用erase()方法,这可能导致迭代器无效
  2. 使用迭代器自增操作而不是+=操作,因为后者可能会导致迭代器变得无效
  3. 在使用反向迭代器时,使用base()方法来获取正向迭代器