为什么std::list有remove和remove_if函数

fir*_*ush 6 c++ algorithm

为什么std::list有remove和remove_if函数?这似乎与同名算法函数重复了行为。如果remove和remove_if有意义,为什么find和find_if不行呢?

Kit*_*it. 4

首先,它们具有不同的语义。std::list::remove_if擦除已删除的元素,但std::remove_if不会。std::remove_if还要求容器元素是 MoveAssignable,而std::list::remove_if只要求它们是 Erasable。

实际上两者之间没有复杂性差异(它们都是 O(n)),但std::remove_if可能会慢两倍左右,因为需要使用两个独立的指针而不是一个指针进行列表遍历 - 并且大多数现代 CPU 上的列表遍历是这是一个相当昂贵的操作。如果容器元素类型的移动操作成本高昂,则速度可能会进一步减慢std::remove_if