Как удалить i-й элемент из std::vector
?
Я знаю, что хочу удалить i-й элемент. У меня int i; and std::vector<process> pList;
, где process
- это структура. Я хочу сделать что-то эквивалентное следующему:
pList.remove(i);
Как удалить i-й элемент из std::vector
?
Я знаю, что хочу удалить i-й элемент. У меня int i; and std::vector<process> pList;
, где process
- это структура. Я хочу сделать что-то эквивалентное следующему:
pList.remove(i);
pList.erase(pList.begin()+i);
Чтобы удалить элемент с индексом i.
Вот решение 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();
Так как vector.erase() является линейной сложностью, я бы предположил, что просто замените i-й элемент последним элементом и , затем стираем элемент в конце (который фактически является i-м элементом); Таким образом, вы, возможно, можете сэкономить от линейной сложности. Это просто моя мысль!
Используйте Vector.Erase. Сложность линейна по количеству стираемых элементов (деструкторов) плюс число элементов после удаления последнего элемента (перемещение).
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );
vector.erase(iterator)
Где итератор - это позиция. Вы можете получить первый элемент с vector.begin() и последним с помощью vector.end(). Просто добавьте к итератору, чтобы добраться до нужного элемента. например:.
pList.erase(pList.begin()+6);
чтобы удалить 6-й элемент.