Когда-то я узнал, что общий способ стирания элементов из контейнера - это стирание-удаление-идиома. Но я был удивлен, узнав, что реализация STL по крайней мере g ++ не перегружает std :: remove() для std :: list, так как в этом случае многие назначения объектов могут быть сохранены путем выполнения переупорядочения с помощью манипуляции с указателем.Как перегрузить std :: удалить для std :: list?
Есть ли причина, по которой стандарт C++ не предусматривает такую оптимизацию? Но мой главный вопрос заключается в том, как я могу перегрузить std :: remove() (он не должен быть переносимым за пределы g ++), поэтому я мог бы предоставить реализацию, которая использует list :: splice()/list :: merge(). Я попробовал пару подписей, но получаю сообщение об ошибке неоднозначности в лучшем случае, например:
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 .: Мне очень жаль, что я не был достаточно ясен. Пожалуйста, проигнорируйте, что функции исходят из пространства имен std и того, что они делают конкретно. Я просто хочу узнать больше о правилах шаблона/typetraits/overload в C++.
Вы должны использовать [ 'зЬй :: список :: remove'] (http://en.cppreference.com/w/cpp/container/список/удалить). –
Это может быть проблема [XY Problem] (http://meta.stackexchange.com/questions/66377). –