【发布时间】:2013-04-17 14:42:27
【问题描述】:
我曾经了解到,从容器中擦除元素的一般方法是通过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);
P.S.:对不起,我不够清楚。请忽略这些函数来自 std 命名空间以及它们的具体作用。我只是想了解更多关于 C++ 中的模板/类型特征/重载规则。
【问题讨论】:
-
你应该使用
std::list::remove。 -
这可能是XY Problem。