一,為何使用迭代器?
模板使算法獨立於存儲的數據類型,而迭代器使算法獨立於使用的容器類型。
二,迭代器的類型
1,輸入迭代器
2,輸出迭代器
3,正向迭代器
4,雙向迭代器
5,隨機訪問迭代器
三,迭代器的層次結構
迭代器的類型形成了一個層次結構。
正向迭代器具有輸入和輸出迭代器的全部功能,同時還有自己的功能。
雙向迭代器具有正向迭代器的全部功能,同時還有自己的功能。
隨機訪問迭代器具有正向迭代器的全部功能,同時還有自己的功能。
根據特定迭代器類型編寫的算法可以使用該迭代器,也可以使用具有所需功能的任何其他迭代器。
所以具有隨機迭代器的容器可以使用為輸入迭代器編寫的算法。
為什麼需要這麼多迭代器呢?
目的是為了在編寫算法時,盡可能使用要求最低的迭代器,並讓它適用於容器的最大區間。這樣,
通過使用級別最低的輸入迭代器,find()函數便可以用於任何包含可讀取值的容器。而sort()函數
由於需要隨機訪問迭代器,所以只能用於支持這種迭代器的容器。
注意:各種迭代器的類型並不是確定的,而只是一種概念上的描述。
迭代器是一系列要求,而不是類型,比如指針也可以滿足一類迭代器的要求—正向迭代器。
所以STL算法可以使用任何滿足其要求的迭代器實現。
四,迭代器的使用
1,將指針用作迭代器
#include
#include
using namespace std;
#define SIZE 100
int iarray[SIZE];
int main()
{
iarray[20] = 50;
int* ip = find(iarray, iarray + SIZE, 50);
if (ip == iarray + SIZE)
cout << "50 not found in array" << endl;
else
cout << *ip << " found in array" << endl;
return 0;
}
2,流及迭代器
#include
#include
#include
#include // Need sort(), copy()
#include
using namespace std;
void Display(vector
int main()
{
// Seed the random number generator
srandom( time(NULL) );
// Construct vector and fill with random integer values
vector
for (int i = 0; i < 10; i++)
collection[i] = random() % 10000;;
// Display, sort, and redisplay
Display(collection, "Before sorting");
sort(collection.begin(), collection.end());
Display(collection, "After sorting");
return 0;
}
// Display label s and contents of integer vector v
void Display(vector
{
cout << endl << s << endl;
copy(v.begin(), v.end(),
ostream_iterator
cout << endl;
}
3,幾種插入迭代器
#include
#include
#include
using namespace std;
int iArray[5] = { 1, 2, 3, 4, 5 };
void Display(list
int main()
{
list
// Copy iArray backwards into iList
copy(iArray, iArray + 5, front_inserter(iList));
Display(iList, "Before find and copy");
// Locate value 3 in iList
list
find(iList.begin(), iList.end(), 3);
// Copy first two iArray values to iList ahead of p
copy(iArray, iArray + 2, inserter(iList, p));
Display(iList, "After find and copy");
return 0;
}
void Display(list
{
cout << s << endl;
copy(a.begin(), a.end(),
ostream_iterator
cout << endl;
}
4,容器迭代器
#include
#include
#include
using namespace std;
vector
void main()
{
intVector[20] = 50;
vector
find(intVector.begin(), intVector.end(), 50);
if (intIter != intVector.end())
cout << "Vector contains value " << *intIter << endl;
else
cout << "Vector does not contain 50" << endl;
}