从向量中删除元素 (hackerrank)

erasing elements from a vector (hackerrank)

我是 C++ 的初学者。我试图解决 this problem 但不能,因此我后来检查了解决方案,但有些行我不明白:

v.erase(v.begin() + x - 1); // i want to know why the "-1" is put here
v.erase(v.begin() + b - 1, v.begin() + c - 1);

代码如下:

int main()
{
  int N, a, x, b, c;
  vector <int> v;
  cin >> N;
  for (int i = 0; i<N; i++)
  {
    cin >> a;
    v.push_back(a);
  }
  cin >> x >> b >> c;
  v.erase(v.begin() + x - 1);
  v.erase(v.begin() + b - 1, v.begin() + c - 1);
  cout << v.size() << endl;
  for (int i = 0; i < v.size(); i++)
  {
    cout << v[i] << " ";
  }
}

该题旨在让你熟悉向量擦除方法的2种常用语法 . 要删除单个元素,请使用

v.erase(传递指向要删除的元素的迭代器)

例如,v.erase(v.begin()) 将擦除向量的第一个元素,换句话说,将擦除向量位置 0 处的元素。

因为此处 v.begin() 是向量第一个元素的迭代器,前提是向量不为空。

同样,

v.erase(v.begin() + x -1);

擦除向量位置 x 处的元素。

现在要擦除向量中的一个范围,使用重载的擦除方法。用法如下,

v.erase(iter1,iter2)

它会擦除iter1到iter2范围内的所有元素,但不包括iter2,即[iter2,iter2)范围内的元素将被擦除。记住 iter2 不会被擦除。 因此这段代码,

v.erase(v.begin() + b - 1, v.begin() + c - 1);

将删除从索引 b 到索引 c 的所有元素,但不包括索引 c 。

#include <cmath>           //Header section
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {  
    vector<int> v;            //initializing vector v
    int n,i,b,c,d,size,val;
    cin>>n;                   //no. of integers in vector v
    for(i=0;i<n;i++)          
    {
        cin>>val;
        v.push_back(val);     /*syntax for input elements in vector, "val" is the 
                                    element*/
    }
    cin>>b;   // input position of element to be erased

    cin>>c>>d;  //input range of elements to be erased

    v.erase(v.begin()+b-1); // func to be used to erase an element

    v.erase(v.begin()+c-1,v.begin()+d-1) // func used to erase a range

    size=v.size();
    cout<<size<<endl;
    for(i=0;i<size;i++)
    {
        cout<<v[i]<<" ";  //leftover elements output
    }
    return 0;
}