Comment supprimer le ième élément d'un std::vector
?
Je sais que je veux supprimer le ième élément. J'ai int i; and std::vector<process> pList;
où process
est une structure. Je veux faire quelque chose d'équivalent à ce qui suit:
pList.remove(i);
pList.erase(pList.begin()+i);
Pour supprimer l'élément avec l'index i.
Voici une solution O(1), en supposant que vous ne vous souciez pas de l'ordre des éléments:
#include <algorithm>
// ...
{
using std::swap;
swap(pList[i], pList.back());
pList.pop_back();
}
Pour les POD, l'attribution est plus rapide que l'échange, vous devez donc simplement écrire:
pList[i] = pList.back();
pList.pop_back();
En C++ 11, vous pouvez oublier la distinction ci-dessus et toujours utiliser la sémantique de déplacement pour une efficacité maximale:
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();
Puisque vector.erase () est une complexité linéaire, je suggérerais simplement d'échanger le ième élément avec le dernier élément et alors d'effacer l'élément à la fin (qui est en fait le ième élément); de cette façon, vous pouvez éventuellement vous sauver de la complexité linéaire. C'est juste ma pensée!
Utilisez Vector.Erase . La complexité est linéaire sur le nombre d'éléments effacés (destructeurs) plus le nombre d'éléments après le dernier élément supprimé (en mouvement).
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );
vector.erase(iterator)
Où itérateur est la position. Vous pouvez obtenir le premier élément avec vector.begin () et le dernier avec vector.end (). Ajoutez simplement à l'itérateur pour accéder à l'élément souhaité. par exemple.:
pList.erase(pList.begin()+6);
pour effacer le 6e élément.