【问题标题】:Help me understand std::erase帮助我理解 std::erase
【发布时间】:2010-12-21 18:11:33
【问题描述】:

在《C++ In A Nutshell》一书中,有如下示例代码

std::vector<int> data
...
std::erase(std::remove(data.begin(), data.end(), 42),
  data.end());

我认为 'erase' 是一个成员函数,所以不应该是 'data.erase' 而不是 'std::erase' 吗? c++ 编译器是否可以通过某种方式告诉您要在哪个成员上调用成员函数,或者本书是否省略了擦除模板函数的任何文档,或者示例错误?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    erase 是一个成员函数。提供的样本不正确。

    【讨论】:

      【解决方案2】:

      没有std::erasestd::map::erasestd::list::erase 存在。但不存在std::erase

      看看this question phantom std::erase。

      【讨论】:

      • 具体来说,所有序列和关联容器都提供成员erase()(这是他们要求的一部分),以及std::basic_string
      【解决方案3】:

      是的,erase 是一个成员函数,所以它应该是data.erase() 而不是std::erase()

      【讨论】:

        【解决方案4】:

        你的观察是正确的。 'Erase' 应该是一个成员函数。只有容器上的成员函数可以更改该容器的内存大小。

        【讨论】:

          【解决方案5】:

          编辑:抱歉,它们不是通用擦除,只是仔细检查

          【讨论】:

          • 没有通用算法erase
          • ... 甚至在&lt;algorithm&gt; 中都没有(继续,试试吧)。
          • 是的,我说有通用擦除算法是不正确的(我记错了)。但是标准库中有一个算法头。其中包括许多通用算法(查找、包含等),适用于各种 stl 容器。
          • 作为一般经验法则:STL 中的算法对迭代器进行操作,通过迭代器它们可以更改容器的内容,但不能更改容器本身。 Erase 是一种修改容器大小的方法,因此不能用迭代器来实现,但需要访问容器本身。
          • @dribeas: 但注意有insert_iterators,可以改变容器的大小。没有匹配的delete_iterators,但没有真正的理由不能匹配。
          【解决方案6】:

          有一种算法叫做std::remove。并在数据结构上调用擦除。 remove 将所有要删除的元素移动到迭代器范围的末尾,并返回要删除的第一个元素。如果找不到元素,则返回 end()。

          然后你在从 std::remove 的返回值和数据结构的结尾开始的范围上调用擦除。

          见:http://www.sgi.com/tech/stl/remove.html

          请注意,remove 不适用于有序数据结构,因为无法重新排列元素。

          remove 是线性的,因此从头到尾删除向量也是如此。因为它不需要在要删除的元素之后冒泡。

          std::vector<int> data
          ...
          data.erase(std::remove(data.begin(), data.end(), 42), data.end())
          

          与这样的 O(N**2) 相比

          std::vector<int> data
          ...
          for ( i = data.begin(), i != data.end(); ++i ) {
            if ( *i == 42 ) data.erase( i ) ;
          }
          

          【讨论】:

          • 再次阅读问题。它使用 std::remove。您不必说“他们想要什么”,因为这是他们使用的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-20
          相关资源
          最近更新 更多