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

std::vector<int> vec;

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

vec.erase(???);

当前回答

删除带索引的元素:

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

删除带值的元素:

vec.erase(find(vec.begin(),vec.end(),value));

其他回答

要删除单个元素,你可以这样做:

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));

前面的答案假设您总是有一个带符号的索引。遗憾的是,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;
}

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"。

希望这对大家有所帮助

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);
}