3、迭代器的定義方式
4、其他
**迭代器目的:**配合容器訪問、運算元據等操作;就像對資料單元的排序、查詢、求和等需要對資料進行遍歷的操作之類的,也特別像鍊錶裡面的指標遍歷的方式是一樣的;
迭代器特性:
1、適用性:適合所有通用的容器(極個別容器除外,因為容器的特性使然)技術是使用的泛型技術
2、封裝性:對外隱藏了具體的實現細節,使用統一的介面對容器及使用者傳遞資料
常用的迭代器按功能強弱分為輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器 5 種。
不同的迭代器功能的強弱來決定了迭代器支援的演算法;就以 p_iter 作為乙個迭代器為例
迭代器類別
支援前項
支援後項
支援隨機
前項迭代器(forward iterator)
p_iter++;++p_iter;*p_iter;==;!=
------------------------
------------
雙向迭代器(bidirectional iterator)
p_iter++;++p_iter;*p_iter;==;!=
p_iter–;--p_iter;
------------
隨機訪問迭代器(random access iterator)
p_iter++;++p_iter;*p_iter;==;!=
p_iter–;--p_iter;
p_iter += i;p_iter -= i;p_iter + i;p_iter - i;p_iter[i];
其實可以看到隨機訪問迭代器具有所有迭代器功能;為最強
解釋(此外,兩個隨機訪問迭代器 p1、p2 還可以用 、<=、>= 運算子進行比較。另外,表示式 p2-p1 也是有定義的,其返回值表示 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)沒太明白)
stl 標準庫為每一種標準容器定義了一種迭代器型別,這意味著,不同容器的迭代器也不同,其功能強弱也有所不同
容器對應的迭代器型別
array
隨機訪問迭代器
vector
隨機訪問迭代器
deque
隨機訪問迭代器
list
雙向迭代器
set / multiset
雙向迭代器
map / multimap
雙向迭代器
forward_list
前向迭代器
unordered_map / unordered_multimap
前向迭代器
unordered_set / unordered_multiset
前向迭代器
stack
不支援迭代器
queue
不支援迭代器
儘管不同容器對應著不同類別的迭代器,但這些迭代器有著較為統一的定義方式,具體分為 4 種
(其實就是之前說的:封裝性)
迭代器定義方式
具體格式
正向迭代器
容器類名::iterator 迭代器名;
常量正向迭代器
容器類名::const_iterator 迭代器名;
反向迭代器
容器類名::reverse_iterator 迭代器名;
常量反向迭代器
容器類名::const_reverse_iterator 迭代器名;
使用 *p_iter (正向)來獲取以及修改元素的值
#include #include using namespace std;
int main()
; //遍歷列印
for (vector::iterator i = myvector.begin(); i != myvector.end(); i++)
cout << "\n\n";
//修改元素值
for (vector::iterator i = myvector.begin(); i != myvector.end(); i++)
*i += 10;
for (vector::iterator i = myvector.begin(); i != myvector.end(); i++)
cout << *i << " ";
cout << "\n" << endl;
return 0;
}
#include #include "example.h"
int main()
; //遍歷列印
for (vector::reverse_iterator i = myvector.rbegin(); i != myvector.rend(); i++)
cout << "\n" << endl;
return 0;
}
常量迭代器和非常量迭代器的分別在於,通過非常量迭代器還能修改其指向的元素,這樣就可以保護容器資料、保證容器不被修改,設定迭代器唯讀屬性
#include #include "example.h"
int main()
; //遍歷列印
for (vector::iterator i = myvector.begin(); i != myvector.end(); i++)
//修改元素值
for (vector::const_iterator i = myvector.begin(); i != myvector.end(); i++)
*i += 10;
cout << "\n" << endl;
return 0;
}
筆記是有一部分自我體會在裡面**參考:
STL讀書筆記 迭代器概念
一。概念 1 迭代器在設計模式中成為iterator模式,其定義為 提供一種方法,使他能夠按順序遍歷某個聚合體 容器 所包含的所有元素,但又不需要暴露該容器的內部表現方式。2 迭代器是一種類似指標的物件,他的工作也主要是內容提取 dereference 和成員的訪問 member access 因此...
STL讀書筆記 迭代器概念
一。概念 1 迭代器在設計模式中成為iterator模式,其定義為 提供一種方法,使他能夠按順序遍歷某個聚合體 容器 所包含的所有元素,但又不需要暴露該容器的內部表現方式。2 迭代器是一種類似指標的物件,他的工作也主要是內容提取 dereference 和成員的訪問 member access 因此...
讀書筆記 迭代器概念與traits程式設計技法
迭代器 提供一種方法,使之能夠依序巡訪某個容器內所有的元素,而又無需暴露該容器的內部表達方式。traits程式設計技法 迭代器所指物件的型別,稱之為該迭代器的value type。1 template 2struct myiter 37 t operator const 8 9 1011 12 te...