C++|瞭解STL迭代器的五個類別

STL算法庫定義了一組函數,這些函數專門設計用於操作容器的某一範圍內的元素。

範圍是可以通過迭代器或指針(如數組或某些STL容器的實例)訪問的任何對象序列。算法通過迭代器直接對值進行操作,不會以任何方式影響任何容器的結構(它永遠不會影響容器的大小或存儲分配)。

容器管理其元素的存儲空間,並提供成員函數來直接或通過迭代器(引用與指針具有類似屬性的對象)訪問這些元素。

迭代器(iterator)是指指向元素範圍(如數組或容器)中某個元素的任何對象,該對象能夠使用一組運算符(至少使用增量(+)和解引用(dereferencing )(*)運算符)遍歷該範圍中的元素。

迭代器最明顯的形式是指針(pointer):指針可以指向數組中的元素,並可以使用增量運算符(++)遍歷它們。但是其他類型的迭代器是可能的。例如,每個容器類型(如列表)都有一個特定的迭代器類型,該迭代器類型旨在遍歷其元素。

注意,雖然指針是迭代器的一種形式,但並非所有迭代器都具有指針的相同功能;根據迭代器支持的屬性,它們被分為五個不同的類別:

Input 輸入

Output 輸出

Forward 前向

Bidirectional 雙向的

Random Access 隨機存取

輸入和輸出迭代器是最有限的迭代器類型:它們可以執行順序的單通道(single-pass)輸入或輸出操作。

前向迭代器具有輸入迭代器的所有功能,如果它們不是常量迭代器,則也具有輸出迭代器的功能,儘管它們僅限於在一個方向上迭代一個範圍(前向)。所有標準容器至少支持前向迭代器類型。

雙向迭代器類似於前向迭代器,但也可以向後(backwards)迭代。

隨機訪問迭代器實現了雙向迭代器的所有功能,並且還能夠非順序地訪問範圍:通過向迭代器應用偏移值,可以直接訪問遠程(distant)元素,而無需迭代其間的所有元素。這些迭代器具有與標準指針類似的功能(指針是此類迭代器)。

每個迭代器類別的屬性是:

C++|瞭解STL迭代器的五個類別

需要注意的是,stack、queue、priority_queue不提供迭代器,其對元素的訪問通過其定義的成員函數進行。

大多數容器都有通過成員函數begin()和end()或rbegin()和rend()來返回一對迭代器,表示容器內全部元素的範圍,算法通常以此兩個迭代器為參數(通常還使用一個函數對象或函數指針做參數):

<code>// sort algorithm example
#include      // std::cout
#include     // std::sort
#include        // std::vector

bool myfunction (int i,int j) { return (i myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator ::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
// count_if example
#include      // std::cout
#include     // std::count_if
#include        // std::vector

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  std::vector myvector;
  for (int i=1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9

  int mycount = count_if (myvector.begin(), myvector.end(), IsOdd);
  std::cout << "myvector contains " << mycount  << " odd values.\n";

  return 0;
}/<code>

-End-


分享到:


相關文章: