STL(四) 迭代器
STL(四) 迭代器
- 迭代器是泛型指针
- 普通指针可以指向内在中的一个地址
- 迭代器可以指向容器中的一个位置
- 通过重载运算符来支持指针操作
- * ++ -- 等
- STL的每一个容器类型中,都定义了一组对应的迭代器。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。
- 迭代器的类型
- 输入迭代器
- 可以用来从序列中读取数据
- 支持*号操作:*p; ++p;
- 这里*p是不能出现在表达式的左边的,不能被赋值。
- 输出迭代器
- 允许向序列中写入数据
- 可以赋值给*p: *p = 0;也具有++操作。
- *p可以出现在表达式的左边,可以被赋值。
- 前向迭代器
- 既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历
- 不支持--操作,逆向减减,不支持
- 双向迭代器
- 与前向迭代器相似,但是在两个方向上都可以对数据遍历
- 在前身的基础上,支持减减操作。
- 随机访问迭代器
- 也是双向迭代器,但能够在序列中的任意两个位置进行跳转
- 在双向的基础上,可以支持+5; -3; += ; -=;等操作
迭代器的类型表 迭代器操作和分类 |
|||||
种类: |
Output |
input |
forward |
bidirectional |
random-access |
缩写: |
Out |
In |
For |
Bi |
Ran |
Read: |
|
=*p |
=*p |
=*p |
=*p |
Access: |
|
-> |
-> |
-> |
-> [] |
Write: |
*p= |
|
*p= |
*p= |
*p= |
Iteration: |
++ |
++ |
++ |
++ |
++ |
Comparison: |
|
== |
== |
== |
== |
- 跟踪迭代器构造:
0 main中断点:std::vector<int>::iterator it;因有自定义typedef _Vector_iterator<_Vector_val<_Val_types> > iterator;
1 来到空构造 _Vector_iterator()处:
2_Vector_iterator() { // construct with null vector pointer }
class _Vector_iterator : public _Vector_const_iterator<_Myvec>
_Vector_const_iterator() : _Ptr() { // construct with null pointer }
template<class _Myvec> class _Vector_const_iterator : public _Iterator012<random_access_iterator_tag, typename _Myvec::value_type, typename _Myvec::difference_type, typename _Myvec::const_pointer, typename _Myvec::const_reference, _Iterator_base>
template<class _Category, class _Ty, class _Diff, class _Pointer, class _Reference, class _Base> struct _Iterator012 : public _Base { // base type for debugging iterator classes typedef _Category iterator_category; typedef _Ty value_type; typedef _Diff difference_type; typedef _Pointer pointer; typedef _Reference reference; };
至此_Base已经跟不下去了。回头——
7 初始_Ptr: 看_Ptr是什么类型-- 转定义:_Tptr _Ptr;原来是_Tptr类型,—— 又 发现typedef typename _Myvec::pointer _Tptr;最后的自定义:typedef typename _Myvec::const_pointer pointer;原来_Ptr是我们传递进来的。在当前就是int *。
8 初始_Ptr()后返回_Vector_iterator() { // construct with null vector pointer }
9 返回到main调用处std::vector<int>::iterator it;
10 vector<int>类型的迭代器的构造就此完成了; 相当于把int*的指针做了一个包装。
- 跟踪迭代器中begin()
0iterator begin() _NOEXCEPT { // return iterator for beginning of mutable sequence return (iterator(this->_Myfirst(), &this->_Get_data())); }
返回一个iterator对象,调用的是iterator(this->_Myfirst(), &this->_Get_data());有2个参数的iterator();
1 发现自定义typedef _Vector_iterator<_Ty, _Alloc> iterator; 调用2个参数的是_Vector_iterator<_Ty, _Alloc>
2_Vector_iterator(pointer _Ptr, const _Container_base *_Pvector) : _Mybase(_Ptr, _Pvector) { // construct with pointer _Ptr }
template<class _Ty, class _Alloc> class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc> { // iterator for mutable vector......}
_Vector_const_iterator(_Tptr _Ptr, const _Container_base *_Pvector) { // construct with pointer _Ptr _SCL_SECURE_VALIDATE(_Pvector == NULL || (((_Myvec *)_Pvector)->_Myfirst <= _Ptr && _Ptr <= ((_Myvec *)_Pvector)->_Mylast)); this->_Adopt(_Pvector); _Myptr = _Ptr; }
(*****未完待续******)