Complexité temporelle de std :: vector :: erase

J’ai trouvé un moyen de supprimer un élément d’un vecteur LIST de sa valeur ici :

vec.erase(remove(vec.begin(), vec.end(), value), vec.end()); 

Maintenant, j’aimerais savoir à quel point cette méthode est efficace, c’est-à-dire sa complexité temporelle en notation Big O.

vec.erase (remove (vec.begin (), vec.end (), valeur), vec.end ());

Dans ce cas, remove compacte les éléments qui diffèrent de la valeur à supprimer (valeur) au début du vecteur et renvoie l’iterator au premier élément après cette plage. Puis effacer supprime les éléments.

Donc, cela rend cette opération O (n).

La norme C ++ 11 spécifie dans [vecteur.modificateurs] / 4:

Complexité : le destructeur de T est appelé le nombre de fois égal au nombre d’éléments effacés, mais l’opérateur d’affectation de mouvement de T s’appelle le nombre de fois égal au nombre d’éléments dans le vecteur après les éléments effacés.

En particulier, effacer des éléments à la fin est assez bon marché, car on ne détruit que les éléments à effacer; la complexité temporelle de l’appel à erase doit donc être linéaire en termes de nombre d’occurrences de value dans vec – ce qui correspond à Θ (n) dans Big-Oh-Notation. La complexité de l’expression entière est toujours linéaire puisque remove a une complexité linéaire en termes de longueur de la plage à laquelle elle est appliquée. Si la taille de vec est décrite par la variable m, nous avons Θ (n + m) pour l’expression complète qui est égale à O (m) (puisque n et m + n <2m , O (2m) = O (m) )

Cela pourrait être n’importe quoi car la complexité des destructures est inconnue

Mais en supposant que ce soit constant, alors ce sera O (n)

O (N) puisque vous parcourez chaque élément de votre vecteur.