Подтвердить что ты не робот

Удалите i-й элемент из С++ std::vector

Как удалить i-й элемент из std::vector?

Я знаю, что хочу удалить i-й элемент. У меня int i; and std::vector<process> pList;, где process - это структура. Я хочу сделать что-то эквивалентное следующему:

pList.remove(i);
4b9b3361

Ответ 1

pList.erase(pList.begin()+i);

Чтобы удалить элемент с индексом i.

Ответ 2

Вот решение O (1), если вы не заботитесь о порядке элементов:

#include <algorithm>

// ...

{
    using std::swap;
    swap(pList[i], pList.back());
    pList.pop_back();
}

Для POD назначение выполняется быстрее, чем замена, поэтому вы должны просто написать:

pList[i] = pList.back();
pList.pop_back();

В С++ 11 вы можете забыть вышеупомянутое различие и всегда использовать семантику перемещения для максимальной эффективности:

if (i != pList.size() - 1)
{
    // Beware of move assignment to self
    // see http://stackoverflow.com/questions/13127455/
    pList[i] = std::move(pList.back());
}
pList.pop_back();

Ответ 3

Подход, чтобы спасти себя от линейной сложности!

Так как vector.erase() является линейной сложностью, я бы предположил, что просто замените i-й элемент последним элементом и , затем стираем элемент в конце (который фактически является i-м элементом); Таким образом, вы, возможно, можете сэкономить от линейной сложности. Это просто моя мысль!

Ответ 4

Используйте Vector.Erase. Сложность линейна по количеству стираемых элементов (деструкторов) плюс число элементов после удаления последнего элемента (перемещение).

iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );

Ответ 5

vector.erase(iterator)

Где итератор - это позиция. Вы можете получить первый элемент с vector.begin() и последним с помощью vector.end(). Просто добавьте к итератору, чтобы добраться до нужного элемента. например:.

pList.erase(pList.begin()+6);

чтобы удалить 6-й элемент.