web-dev-qa-db-fra.com

Supprimer le ième élément d'un std C ++ :: vector

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;process est une structure. Je veux faire quelque chose d'équivalent à ce qui suit:

pList.remove(i);
32
kralco626
pList.erase(pList.begin()+i);

Pour supprimer l'élément avec l'index i.

60
Vladimir

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();
81
fredoverflow

Une approche pour vous sauver de la complexité linéaire!

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!

10
Nawaz

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 );
4
Sanjit Saluja
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.

3
Tom Johnson