【问题标题】:Why isn’t the standard library calling a container remove function if it exists?为什么标准库不调用容器删除函数(如果存在)?
【发布时间】:2014-02-12 12:26:56
【问题描述】:

C++标准库中是这样说的

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

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

【问题讨论】:

  • 大多数容器都有自己的erase(),比如vector
  • 如果erase函数不存在该怎么办?
  • @PlasmaHH 好吧,我猜没什么
  • @qdii:对我来说,调用一个名为 erase 的函数然后不执行任何操作听起来很违反直觉......

标签: c++ algorithm stl erase c++-standard-library


【解决方案1】:

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

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

【讨论】:

  • 这不仅成本高,而且通常是不可能的。对于给定的示例,语义存在问题:std::removestd::set<>::erase 具有显着不同的语义,例如(std::set<>::erase 采用与 std::vector<>::erase 不同的参数)。
  • @JamesKanze:确实,将remove 更改为erase 会很奇怪。更好的用例可能是 std::sortstd::list::sort
猜你喜欢
  • 2015-09-02
  • 2020-07-14
  • 2011-03-23
  • 2015-01-15
  • 2021-06-08
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多