讀書筆記 《STL STL迭代器?》

2021-10-25 20:40:12 字數 3039 閱讀 6018

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...