簡體   English   中英

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

[英]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中看到它的要求並實現它們:

  • 上下文可轉換為bool( a != b
  • 可轉換為T( *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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM