[英]What does it take to be an `stl` algorithm compatible container?
1)對於給定的stl
算法,如何找出為了使用所述容器需要實現的自定義容器/迭代器功能?
2)需要實現什么才能使容器與所有stl
算法完全兼容?
在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
) 每種迭代器都有相同的故事。
STL算法使用模板類型來描述函數的要求。 如果你以std::sort
為例
template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
我們可以看到,我們需要傳遞一個隨機訪問兼容的迭代器。 因此,只要您擁有的容器具有迭代器類型的RandomAccessIterator,或者它支持RandomAccessIterator支持的所有操作,那么您可以將它與std::sort
。
如果我們查看cppreference上的迭代器層次結構我們可以看到,在當前標准中, RandomAccessIterator是所有其他迭代器類型的超集,並支持其他迭代器支持的所有操作。 因此,如果函數調用InputIterator,我們仍然可以給它一個RandomAccessIterator。
所以現在如果您的容器有一個RandomAccessIterator,您可以在任何STL算法中使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.