我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?

std::vector<int> vec;

vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);

vec.erase(???);

当前回答

最快的方法(对于时间复杂度()=常量的编程竞赛)

可在1秒内擦除100M项目;

    vector<int> it = (vector<int>::iterator) &vec[pos];
    vec.erase(it);

最易读的方式: Vec.erase (vec.begin() + pos);

其他回答

erase方法将以两种方式使用:

擦除单个元素: 向量。Erase (vector.begin() + 3);//删除第四个元素 元素擦除范围: 向量。删除(vector.begin() + 3, vector.begin() + 5);//从第4个元素删除到第6个元素

std::vector上的erase方法重载了,所以调用它可能更清楚

vec.erase(vec.begin() + index);

当你只想擦除一个元素时。

我建议阅读这篇文章,因为我相信这就是你在寻找的东西。https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom

举个例子

 vec.erase(vec.begin() + 1, vec.begin() + 3);

你将擦除向量的第n个元素,但当你擦除第二个元素时,向量的所有其他元素将被移动,向量的大小将为-1。如果循环遍历vector,这可能是个问题,因为vector size()正在减小。如果你有这样的问题,建议使用标准c++库中现有的算法。和"remove"或"remove_if"。

希望这对大家有所帮助

你需要使用标准模板库的std::vector::erase函数。

示例:从vector中删除一个元素(使用index)

// Deleting the eleventh element from vector vec
vec.erase( vec.begin() + 10 ); 

以上代码的解释

std::向量< T,分配器>::消除用法:

iterator erase (iterator position); // until C++11
iterator erase( const_iterator pos ); // since C++11 and until C++20
constexpr iterator erase( const_iterator pos ); // since C++20

这里有一个参数position,它是指向要从vector中移除的单个元素的迭代器。 成员类型iterator和const_iterator是指向元素的随机访问迭代器类型。

它是如何工作的

擦除函数做以下工作:

它从向量中删除单个元素(position)或一组元素([first, last))。 它通过删除被销毁的元素的数量来减小容器的大小。

注意:迭代器pos必须有效且可解引用。因此end()迭代器(有效,但不可解引用)不能用作pos的值。

返回值和复杂度

返回值是一个迭代器,指向被函数调用擦除的最后一个元素后面的元素的新位置。这是擦除序列中最后一个元素的操作的容器结束。

成员类型迭代器是指向元素的随机访问迭代器类型。

在这里,时间复杂度与删除的元素数量(销毁)加上最后一个元素删除后的元素数量(移动)成线性关系。

最快的方法(对于时间复杂度()=常量的编程竞赛)

可在1秒内擦除100M项目;

    vector<int> it = (vector<int>::iterator) &vec[pos];
    vec.erase(it);

最易读的方式: Vec.erase (vec.begin() + pos);