迭代器的介紹
使用迭代器需要引用頭文件,但一般的容器都引用了這個頭文件。
這五種迭代器的聲明如下:
struct output_iterator_tag { };//輸出迭代器
struct input_iterator_tag{ };//輸入迭代器
struct forward_iterator_tag : public input_iterator_tag {};//向前迭代器
struct bidirectional_iterator_tag : public forward_iterator_tag {};//雙向迭代器
struct random_access_iterator_tag : public bidirectional_iterator_tag{};//隨機迭代器
迭代器的適配器
Insert迭代器,也稱為inserter,用于安插新數據。利用這種迭代器,算法將執行安插(insert)而不是賦值(雖然操作是賦值)。
#include <iterator>
#include <vector>
#include <iostream>
using namespace std;//輸出coll的所有元素值
template<typename T>
void Show(const T& coll)
{for (auto& x : coll)cout << x << " ";cout << endl;
}int main()
{vector<int> v;//auto it1 = v.begin();//for (int i = 0; i < 3; i++)//錯誤,v是空的容器,不能通過普通迭代器賦值(插入)數據//{// *it1 = i;// it1++;//}Show(v); //輸出容器的所有元素//通過類創建對象back_insert_iterator<vector<int> > it2(v);//創建插入迭代器對象it2 = 1; //不解引用直接賦值it2++; //迭代器后移*it2 = 2; //解引用賦值,和直接賦值一樣,等同it2 = 2;++it2; //迭代器后移,等同it2++*it2 = 3;Show(v);//輸出容器的所有元素//通過函數創建對象back_inserter(v) = 4;//用函數創建插入迭代器并賦值*back_inserter(v) = 5;//用函數創建插入迭代器并賦值Show(v);//接收函數返回值,可以多次使用auto it3 = back_inserter(v);//這種最簡單好用*it3++ = 6;it3++ = 7;it3 = 8;it3 = 9;//這行并沒有用9覆蓋8,而是在后面新插入一個9Show(v);return 0;
}
說明:
1.容器不能通過普通的迭代器插入數據。
2.可以通過back_insert_iterator創建尾插迭代器對象,也可以通過back_inserter函數創建尾插迭代器對象。
3.注意it2 = 1和*it2 = 2都是插入一個數據而不是賦值。
4.建議使用back_inserter,更簡單。
所以上面的程序,可以用下面更簡單的方法實現
int main()
{vector<int> v;//接收函數返回值,可以多次使用auto it3 = back_inserter(v);//這種最簡單好用for (int i = 1; i < 10; i++)it3 = i; //插入iShow(v);return 0;
}
安插迭代器種類
C++標準庫提供三種insert迭代器(適配器):back inserter(尾插迭代器),front inserter(頭插迭代器)和general inserter(一般插入迭代器)。它們的區別在于插入的位置。每一種迭代器都可以通過一個函數生成和初始化。
上表中cont表示容器,pos表示插入位置迭代器,value表示插入的元素。
當然,容器本身必須支持安插迭代器所調用的容器內部的函數。
本篇完!