我曾经了解到,从容器中擦除元素的一般方法是通过 erase-remove-idiom。但我惊讶地发现,至少 g++ 的 STL 实现不会为 std::list 重载 std::remove(),因为在这种情况下,可以通过指针操作进行重新排序来保存很多对象分配。
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);
PS:对不起,我不够清楚。请忽略这些函数来自 std 命名空间以及它们的具体作用。我只是想了解更多关于 C++ 中的模板/类型特征/重载规则。