成为`stl`算法兼容容器需要什么?

时间:2015-09-22 16:05:18

标签: c++ stl

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

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

2 个答案:

答案 0 :(得分:5)

在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,Random- AccessIterator1或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
  • dereferenceable(a->m
  • 可递增

每种迭代器都有相同的故事。

答案 1 :(得分:0)

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

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

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

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

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