J'ai appris une fois que la manière générale d'effacer des éléments d'un conteneur est via l'idiome erase-remove. Mais j'ai été surpris de découvrir qu'au moins l'implémentation STL de g ++ ne surcharge pas std :: remove() pour std :: list, puisque dans ce cas beaucoup d'affectations d'objets pourraient être sauvées en faisant le réordonnancement via la manipulation du pointeur.Comment superposer std :: remove pour std :: list?
Y a-t-il une raison pour laquelle la norme C++ n'impose pas une telle optimisation? Mais ma question principale est comment je peux surcharger std :: remove() (il ne doit pas être portable au-delà de g ++), donc je pourrais fournir une implémentation qui utilise list :: splice()/list :: merge() à la place. J'ai essayé quelques signatures, mais obtenir une erreur d'ambiguïté au mieux, par exemple:
template <typename T>
typename std::list<T>::iterator
remove(typename std::list<T>::iterator first,
typename std::list<T>::iterator last, const T &v);
P.S .: Je suis désolé que je n'étais pas assez clair. S'il vous plaît ignorer que les fonctions proviennent de l'espace de noms std et ce qu'ils font spécifiquement. Je souhaite juste en savoir plus sur les règles template/typetraits/overload en C++.
Vous êtes censé utiliser [ 'std :: liste :: remove'] (http://en.cppreference.com/w/cpp/container/list/remove). –
Cela peut être un [Problème XY] (http://meta.stackexchange.com/questions/66377). –