如果存在容器移除函数,为什么标准库不调用它? 在C++标准库中,据说

如果存在容器移除函数,为什么标准库不调用它? 在C++标准库中,据说,c++,algorithm,stl,erase,c++-standard-library,C++,Algorithm,Stl,Erase,C++ Standard Library,容器可能具有提供更好性能的成员函数 例如,由于SFINAE允许检测这样的成员函数是否存在,因此编写std::erase以调用容器的成员函数(如果存在)应该不会太复杂。为什么不这样做呢?标准算法使用的是迭代器范围,而不是容器。给定一个迭代器,甚至没有标准的方法来判断它是否来自容器;当然,如果容器确实存在,就无法访问它 为了支持这一点,以及膨胀迭代器需求以支持您建议的元编程,您还需要使用指向其容器的指针/引用膨胀每个迭代器。这将是一个相当高的成本,因为许多迭代器类型通常实现为单个指针,因为您通常知道

容器可能具有提供更好性能的成员函数


例如,由于SFINAE允许检测这样的成员函数是否存在,因此编写std::erase以调用容器的成员函数(如果存在)应该不会太复杂。为什么不这样做呢?

标准算法使用的是迭代器范围,而不是容器。给定一个迭代器,甚至没有标准的方法来判断它是否来自容器;当然,如果容器确实存在,就无法访问它


为了支持这一点,以及膨胀迭代器需求以支持您建议的元编程,您还需要使用指向其容器的指针/引用膨胀每个迭代器。这将是一个相当高的成本,因为许多迭代器类型通常实现为单个指针,因为您通常知道要处理的是哪种类型的容器,因此很少需要进行优化。

标准算法使用迭代器范围,而不是容器。给定一个迭代器,甚至没有标准的方法来判断它是否来自容器;当然,如果容器确实存在,就无法访问它


为了支持这一点,以及膨胀迭代器需求以支持您建议的元编程,您还需要使用指向其容器的指针/引用膨胀每个迭代器。这将是一个相当高的成本,因为许多迭代器类型通常实现为单个指针,因为您通常知道要处理的是哪种类型的容器,所以很少需要进行优化。

大多数容器都有自己的擦除功能,如vector。如果不存在擦除功能,该怎么办?@Plasmah,没什么,我guess@qdii:对我来说,调用名为erase的函数然后不进行任何签名听起来很违反直觉…大多数容器都有自己的erase,比如vector。如果erase函数不存在,该怎么办?@plasmah,没什么,我guess@qdii:对我来说,调用一个名为erase的函数然后不进行任何签名听起来很违反直觉……这不仅成本高,而且通常是不可能的。对于给定的示例,语义有一个问题:std::remove的语义与std::set::erase明显不同,例如std::set::erase和std::set::erase使用的参数与std::vector::erase不同。@JamesKanze:实际上,将remove更改为类似于erase的行为会很奇怪。一个更好的用例可能是std::sort与std::list::sort。这不仅成本高,而且通常是不可能的。对于给定的示例,语义有一个问题:std::remove的语义与std::set::erase明显不同,例如std::set::erase和std::set::erase使用的参数与std::vector::erase不同。@JamesKanze:实际上,将remove更改为类似于erase的行为会很奇怪。更好的用例可能是std::sort,而不是std::list::sort。