我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
我有一个std::vector<int>,我想删除第n个元素。我怎么做呢?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
当前回答
template <typename T>
void remove(std::vector<T>& vec, size_t pos)
{
std::vector<T>::iterator it = vec.begin();
std::advance(it, pos);
vec.erase(it);
}
其他回答
要删除单个元素,你可以这样做:
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
// Deletes the second element (vec[1])
vec.erase(std::next(vec.begin()));
或者,一次删除多个元素:
// Deletes the second through third elements (vec[1], vec[2])
vec.erase(std::next(vec.begin(), 1), std::next(vec.begin(), 3));
最快的方法(对于时间复杂度()=常量的编程竞赛)
可在1秒内擦除100M项目;
vector<int> it = (vector<int>::iterator) &vec[pos];
vec.erase(it);
最易读的方式: Vec.erase (vec.begin() + pos);
如果需要擦除for循环中的元素,请执行以下操作:
for(int i = 0; i < vec.size(); i++){
if(condition)
vec.erase(vec.begin() + i);
}
std::vector上的erase方法重载了,所以调用它可能更清楚
vec.erase(vec.begin() + index);
当你只想擦除一个元素时。
你需要使用标准模板库的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的值。
返回值和复杂度
返回值是一个迭代器,指向被函数调用擦除的最后一个元素后面的元素的新位置。这是擦除序列中最后一个元素的操作的容器结束。
成员类型迭代器是指向元素的随机访问迭代器类型。
在这里,时间复杂度与删除的元素数量(销毁)加上最后一个元素删除后的元素数量(移动)成线性关系。