1)对于给定的stl
算法,如何找出为了使用所述容器需要实现的自定义容器/迭代器功能?
2)需要实现什么才能使容器与所有stl
算法完全兼容?
答案 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中看到它的要求并实现它们:
a != b
)*a
)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算法中使用它。