我有一个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);
}

其他回答

如果需要擦除for循环中的元素,请执行以下操作:

for(int i = 0; i < vec.size(); i++){

    if(condition)
        vec.erase(vec.begin() + i);

}

你需要使用标准模板库的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的值。

返回值和复杂度

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

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

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

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

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

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

实际上,擦除功能适用于两种配置文件:

删除单个元素 迭代器擦除(迭代器位置); 删除一系列元素 迭代器擦除(迭代器先,迭代器后);

因为std:: vvector .begin()标志着容器的开始,如果我们想删除vector中的第i个元素,我们可以使用:

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

如果你仔细观察,vecc .begin()只是一个指向我们的向量的起始位置的指针,并且向它添加i的值将增加指向i位置的指针,因此我们可以通过以下方式访问指向第i个元素的指针:

&vec[i]

所以我们可以这样写:

vec.erase(&vec[i]); // To delete the ith element

前面的答案假设您总是有一个带符号的索引。遗憾的是,std::vector使用size_type进行索引,使用difference_type进行迭代器算术,所以如果你启用了"-Wconversion"和friends,它们就不能一起工作。这是另一种回答问题的方式,同时能够处理有符号和无符号:

删除:

template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
void remove(std::vector<T> &v, I index)
{
    const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
    v.erase(iter);
}

采取:

template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
T take(std::vector<T> &v, I index)
{
    const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);

    auto val = *iter;
    v.erase(iter);

    return val;
}