簡體   English   中英

STL算法如何獨立於Iterator類型工作?

[英]How does STL algorithm work independent of Iterator type?

STL算法如何獨立於Iterator類型工作?

真的,他們只是工作。 它們使用模板的一些非常基本的屬性,有時稱為靜態多態。 如果你熟悉這個術語,它實質上是一種形式的鴨子。 (如果它看起來像一只鴨子,它像鴨子一樣嘎嘎叫,它一定是鴨子)

訣竅很簡單。 這是一個非常簡單的例子:

template <typename T>
void say_hello(const T& t) {
  t.hello();
}

say_hello函數不關心其參數是哪種類型。 它不必從接口派生出來,也不必做任何其他類型的“承諾”。 重要的是該類型在此上下文中起作用 我們所做的所有類型都是調用它的hello函數。 這意味着此代碼將針對具有hello成員函數的任何類型進行編譯。

STL算法的工作方式類似。 這是std::for_each的簡單實現:

template <typename iter_type, typename func_type>
void for_each(iter_type first, iter_type last, func_type f){
  for (iter_type cur = first; cur != last; ++cur) {
    f(*cur);
  }
}

只要模板類型符合它們的要求,此代碼就會編譯; iter_type必須有預增量++ - 運算符。 它必須有一個復制構造函數,它必須有!=運算符,並且必須有* -dereference-operator。

func_type必須實現函數調用運算符,通過取消引用類型為iter_type的對象獲取與您獲得的相同類型的參數。 如果我用滿足這些要求的類型調用for_each ,代碼將編譯。 iter_type可以是滿足這些要求的任何類型。 代碼中沒有任何內容表示“這應該適用於矢量迭代器和列表迭代器以及映射迭代器”。 但只要向量,列表或映射迭代器實現我們使用的運算符,它就可以工作。

STL算法是模板函數,這意味着可以使用任何類型調用它們。

當使用特定類型調用函數時,編譯器將嘗試為此特定類型編譯函數的實例並報告任何編譯錯誤(缺少方法,鍵入檢查錯誤等)

對於STL算法,只要使用的類型行為類似於迭代器(支持++,解除引用),它就可以工作。 這就是為什么這些算法也適用於本機指針的原因,因為它們支持與迭代器相同類型的操作(這就是它們首先設計的方式)。

編譯器會為您使用的每個迭代器類型自動生成任何STL算法。

它被稱為C ++模板或靜態多態。

每個STL算法都是一個模板函數,它將迭代器類型作為模板參數。

並非所有STL容器/迭代器算法都具有此獨立性。 那些做的是調用通用算法,但這些通常只稱為STL算法。

只使用迭代器,您可以:

  • 檢查序列,這樣你就可以做find,count,for_each,...
  • 更改迭代器引用的值,以便您可以執行轉換,復制,旋轉,交換,替換等操作...
  • 重新排序迭代器的值,因此您可以執行sort,merger和nth_element之類的操作。

一些非通用算法可以分為兩個階段,STL通用部分和容器依賴部分。 因此,為了在向量中銷毀大於7的所有值,我們可以執行remove_if(僅對元素進行排序的通用部分),然后執行擦除(銷毀該值的非通用部分)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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