【问题标题】:What does it take to be an `stl` algorithm compatible container?成为一个“stl”算法兼容的容器需要什么?
【发布时间】:2015-09-22 16:05:18
【问题描述】:

1) 对于给定的stl 算法,如何找出需要实现哪些自定义容器/迭代器功能才能使用所述容器?

2) 需要实现什么才能使容器完全兼容所有stl 算法?

【问题讨论】:

  • @RSahu 我不同意你的欺骗目标,因为 OP 没有询问如何实现迭代器,而是询问算法需要哪些迭代器类型以及如何使用其容器支持所有算法。
  • @NathanOliver,如果容器具有正确的迭代器,它可以在大多数(如果不是全部)算法中使用。这不是真的吗?
  • @RSahu 欺骗目标在哪里?使一个类可迭代并不意味着它适用于所有算法。类的迭代器类型有,迭代器类型不讲。
  • @NathanOliver,我明白你的意思了。
  • 两个问题都没有。 STL 算法现在与容器无关,因此它们对容器没有要求。

标签: c++ stl


【解决方案1】:

在 C++11 标准中,它在 §25.1 的脚注中说明:

3 所有算法都与数据结构的特定实现分离,并由迭代器类型参数化。因此,它们可以使用程序定义的数据结构,只要这些数据结构具有满足算法假设的迭代器类型。

然后:

5 在本条款中,模板参数的名称用于表达类型要求。如果算法的模板参数是 InputIterator、InputIterator1 或 InputIterator2,则实际模板参数应满足输入迭代器的要求(24.2.3)。如果算法的模板参数是OutputIterator、OutputIterator1 或OutputIterator2,则实际模板参数应满足输出迭代器的要求(第24.2.4 节)。如果算法的模板参数是 ForwardIterator、ForwardIterator1 或 ForwardIterator2,则实际模板参数应满足前向迭代器的要求(第 24.2.5 节)。如果算法的模板参数是BidirectionalIterator、Bidirectional-Iterator1 或BidirectionalIterator2,则实际的模板参数应满足双向迭代器的要求(第24.2.6 节)。如果算法的模板参数是 RandomAccessIterator、RandomAccessIterator1 或 RandomAccessIterator2,则实际的模板参数应满足随机访问迭代器的要求(第 24.2.7 节)。

所以基本上你需要为你的自定义类提供一种检索常用迭代器的方法,并且这些对象必须满足要求,具体取决于你想要支持的算法。

以std::any_of为例,你可以看到它被声明为

template <class InputIterator, class Predicate> 
bool any_of(InputIterator first, InputIterator last, Predicate pred);

所以你需要为它提供一个输入迭代器,然后你可以在 §24.2.3 看到它的要求并实现它们:

  • 上下文可转换为 bool (a != b)
  • 可转换为 T (*a)
  • 可取消引用 (a-&gt;m)
  • 可递增

每种迭代器的故事相同。

【讨论】:

    【解决方案2】:

    STL 算法使用模板类型来描述函数的需求。如果以std::sort为例

    template<class RandomAccessIterator>
    void sort(RandomAccessIterator first, RandomAccessIterator last);
    

    我们可以看到我们需要传递一个随机访问兼容的迭代器。因此,只要您拥有的容器具有 RandomAccessIterator 的迭代器类型,或者它支持 RandomAccessIterator 支持的所有操作,那么您就可以将它与 std::sort 一起使用。

    如果我们查看cppreference 上的迭代器层次结构,我们可以看到在当前标准中,RandomAccessIterator 是所有其他迭代器类型的超集,并支持其他迭代器支持的所有操作。所以如果一个函数需要一个 InputIterator,我们仍然可以给它一个 RandomAccessIterator。

    所以现在如果你的容器有一个 RandomAccessIterator 你可以在任何 STL 算法中使用它。

    【讨论】:

      猜你喜欢
      • 2011-07-24
      • 2010-11-23
      • 2021-12-04
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多