1、迭代器(iterators)概念
(1)迭代器是一種抽象的設計概念,其定義為:提供一種方法,使他能夠按順序遍歷某個聚合體(容器)所包含的所有元素,但又不需要暴露該容器的內部表現方式。
(2)迭代器是一種行為類似智慧型指標的物件, 而指標最常見的行為就是內 容提領和成員 訪問。 因此迭代器最重要的行為就是對operator*和operator->進行過載。
(3)stl的中心思想在於: 將資料容器和演算法分開, 彼此獨立設計, 最後再以一貼膠合劑( iterator) 將它們撮合在一起。stl的迭代器是乙個可遍歷stl容器全部或者部分資料。
2、迭代器的使用
以list和vector為例說明
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7void
test1()
821 cout<22//
stl的排序演算法
23sort(v1. begin() , v1. end() ) ;
24 it=v1. begin() ;
25for(; it! =v1. end() ; ++it)
2629 cout<31voidtest2()
3244 cout<45//
stl的替換演算法
46 replace(l1. begin() , l1. end() , "
xjh", "
lcf"
) ;47 it=l1. begin() ;
48for(; it! =l1. end() ; ++it)
4952 cout<54voidtest3()
5567 cout<68//
stl的find演算法查詢迭代器區間的資料, 並返回找到節點的迭代器
69 it=find(l1. begin() , l1. end() , "yb"
) ;70
if(it! =l1. end() )
7176 it=find(l1. begin() , l1. end() , "yb"
) ;77
if(it==l1. end() )
7881 }
3、什麼是迭代器失效
以vector為例,當我們插入乙個元素時它的預分配空間不夠時,它會重新申請一段新空間,將原空間上的元素 複製到新的空間上去,然後再把新加入的元素放到新空間的尾部,以滿足vector元素要求連續儲存的目的。而後原空間會被系統撤銷或徵做他用,於是指向原 空間的迭代器就成了類似於「懸垂指標」一樣的東西,指向了一片非法區域。如果使用了這樣的迭代器會導致嚴重的執行時錯誤就變得很自然了。這也是許多書上敘 述vector在insert操作後「可能導致所有迭代器實效」的原因。但是想到這裡我不禁想到vector的erase操作的敘述是「會導致指向刪除元 素和刪除元素之後的迭代器失效」。
1void printvector(vector&v)
28 cout<10void
test1()
1131
printvector(v1) ;32}
33void printlist(list&l1)
3440 cout<42void
test2()
4363
printlist(l1) ;
64 }
1//1.正向迭代器/反向迭代器2//
2.const/非const
3void printlist(const list&l)
411 cout<1213 list::const_reverse_iterator rit =l.rbegin();
14while (rit !=l.rend())
1520 cout<2122
//list::iterator it1 = l.end();
23//
while (it1 != l.begin())
24//
28//
cout<29 }
歸納一下迭代器失效的型別:
(1)由於容器元素整體「遷移」導致存放原容器元素的空間不再有效,從而使得指向原空間的迭代器失效。
(2)由於刪除元素使得某些元素次序發生變化使得原本指向某元素的迭代器不再指向希望指向的元素。
4、模擬實現簡化版list迭代器&嵌入list
1#pragma once
2 #include3 #include4
using
namespace
std;
56 template
7struct
itlistnode817
};18
//list的迭代器
19 template
20class
listiterator
2131 ref operator*()
34 ptr operator->()
38 self& operator--()
42 self& operator--(int
) 47 self& operator++()
51 self& operator++(int
) 56
bool
operator != (const self& s)const
59};
6061
//雙向迴圈鍊錶
62 template
63class
list
6476 list(const t&l)
77:head(buynode(t()))
7886
}87 list& operator=(const t&l)
91return *this;92
}93 ~list()
98iterator begin()
101 coniterator begin()const
104iterator end()
107 coniterator end()const
110void
clear()
117 head->_next =head;
118 head->_prev =head;
119}
120void pushback(const t&n)
129void
popback()
132void pushfront(const t&n)
135void
popfront()
138//
在pos前插入乙個節點
139void insert(iterator pos, const t&n)
148//
在pos前插入乙個節點
149iterator erase(iterator pos)
159 iterator find(const t&n)
165return
end();
166}
167168
protected
:169 node* buynode(const t&n)
172173
private
:
174 node*head;
175};
176177
//1.測試list迭代器iterator
178void printlist1(list&l1)
179185 cout <186}
187//
2.測試list迭代器constiterator
188void printmylist(const list&l1)
194 cout <195}
196int
main()
list迭代器的模擬實現
namespace bite listnode ppre listnode pnext t val list 的迭代器 迭代器有兩種實現方式,具體應根據容器底層資料結構實現 1.原生態指標,比如 vector 2.將原生態指標進行封裝,因迭代器使用形式與指標完全相同,因此在自定義的類中必須實現以下方...
迭代器模擬實現STL中的list
list中的迭代器類似與智慧型指標的作用,它是將指向鍊錶指向結點的指標管理起來。在stl中的list是帶頭結點的雙向迴圈鍊錶,這樣的設計很巧妙,可以讓我們的插入和刪除元素的時候減少一些需要考慮的邊界問題。要模擬實現stl中的list我們首先得模擬實現迭代器,設計成用來管理指向list中結點的指標。因...
C 模擬實現list容器(支援迭代器)
要模擬實現乙個list容器,主要就是相關頭插頭刪尾插尾刪的介面,這些非常常用。另外有乙個點灰常重要!那就是list的迭代器,list的迭代器不能用原生指標去模擬實現,因為鍊錶的迭代器加一是下乙個節點的指標,在記憶體中兩個節點存放的位置並不連續。因為list的迭代器會指向下乙個節點,所以我們建立乙個迭...