Как стереть элемент из std :: vector <> по индексу? - PullRequest
437 голосов
/ 17 мая 2009

У меня есть std :: vector , и я хочу удалить n-й элемент. Как мне это сделать?

std::vector<int> vec;

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

vec.erase(???);

Ответы [ 12 ]

0 голосов
/ 23 августа 2018

вот еще один способ сделать это, если вы хотите удалить элемент, найдя его с его значением в векторе, вам просто нужно сделать это на векторе.

vector<int> ar(n);
ar.erase(remove(ar.begin(), ar.end()), (place your value here from vector array));

это удалит ваше значение отсюда. спасибо

0 голосов
/ 25 октября 2016

В предыдущих ответах предполагается, что у вас всегда есть индекс со знаком. К сожалению, std::vector использует size_type для индексации и difference_type для арифметики итераторов, поэтому они не работают вместе, если у вас включена опция -Wconversion и друзья. Это еще один способ ответить на вопрос, имея возможность обрабатывать как подписанные, так и неподписанные:

Удалить:

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