1. 程式人生 > >STL中迭代器淺析(轉自:http://blog.csdn.net/gou_zh/archive/2008/11/04/3209974.aspx)

STL中迭代器淺析(轉自:http://blog.csdn.net/gou_zh/archive/2008/11/04/3209974.aspx)

STL中迭代器淺析
 
C++中的迭代器主要有三種,迭代器的作用就是讓你用*iter就可以訪問容器中的值,用iter++就可以向後遍歷,而不必去管容器的內部結構。
 
1.insert iterator(安插型迭代器,三種)
back_insert_iterator, front_insert_iterator, insert_iterator //使用前必須初始化
back_inserter(), front_inserter(), inserter() //與上面迭代器相關的函式
 
使用方法如下:
vectorcoll;
back_insert_iterator< vector >iter(coll);
front_insert_iterator< vector >iter2(coll);
back_inserter(coll) = 20; //在coll後面插入值20
front_inserter(coll) = 50; //在coll前面插入值50
copy(coll.begin(), coll.end(), back_insert(coll));
 
setcoll2;
insert_iterator< set >iter(coll2, coll2.begin());
inserter(coll2, coll2.end()) = 50;
copy(coll2.begin(), coll.end(), inserter(coll2, coll2.begin());

從上面的例子可以看出,類似back_insert_iterator的可以直接用物件初始化,用*iter取元素,iter++遞增;同時,back_inserter是種簡單方法,它可以在被賦值後自動遞增迭代器;front_insert_iterator與之不同處在於它每安插一個元素都是在已有的元素前面;而insert_iterator初始化時不僅要指出要插入的物件,還需要被告知即將插入的位置。
 
2.reverse iterator(逆向迭代器,一般用於可以雙向移動的容器)
deque::iterator pos = coll.begin();
deque::reverse_iterator rpos(pos);  //反轉
deque::iterator rrpos = rpos.base(); //再次反轉
 
由上可知,逆向迭代器的初始化方式需要指定域,他不是所有容器都能使用。
 
3.stream iterator(流迭代器)
istream_iterator, ostream_iterator;

使用方法如下:
copy(coll.begin(), coll.end(), ostream_iterator(cout));  //拷貝到標準輸出
copy(coll.begin(), coll.end(), ostream_iterator(cout," ")); //以空格隔開
 
istream_iterator cinpos(cin);
ostream_iterator coutpos(cout);
while( cinpos != istream_iterator() )*coutpos++ = *cinpos++; //將標準輸入拷貝到標準輸出
注意istream迭代器中出現的istream_iterator(),他表示流結束,產生一個end-of-stream資訊。
 
4.與迭代器相關的函式
void advance(InputIterator &pos, dist n); //使迭代器pos移動n個元素,移動方向取決於n的正負
dist distanse(InputIterator pos1, InputIterator pos2); //返回兩個迭代器的間距,兩個迭代器必須在同一容器,而且有先後次序
void iter_swap(ForwardIterator1 pos1, ForwardIterator2 pos2); //交換兩個迭代器的元素值