STL之迭代器(iterator)

迭代器的基本概念

迭代器(iterator)模式又稱為游標(Cursor)模式,用于提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。或者這樣說可能更容易理解:Iterator模式是運用于聚合對象的一種模式,通過運用該模式,使得我們可以在不知道對象內部表示的情況下,按照一定順序(由iterator提供的方法)訪問聚合對象中的各個元素。

迭代器產生原因(或者本質)

Iterator 類的訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到循環遍歷集合的效果。

迭代器的類型

輸入迭代器 ( InputIterator ) 、輸出迭代器 ( OutputIterator ) 、前向迭代器(ForwardIterator ) 、雙向迭代器 ( BidirectionalIterator ) 、隨機訪問迭代器(RandomAccessIterator )
每個迭代器類型對應的操作。

類別
簡寫
輸出
output
輸入
input
前向
Forward
雙向
Bidirection
隨機
Random
=* p
=*p=*p=*p
訪問
->
->
->
-> []
* p =
*p=*p=*p=
迭代
++
++++
++/--
++/--/+/-/+=/-=
比較
==/!=
==/!=
==/!=
==/!=/</>/<=/>=
五種迭代器之間的關系圖

為什么定義這么多迭代器

物盡其用,使得具體的操作使用具體類型的迭代器,避免迭代器的功能太大或者太小,導致使用起來不方便。每個容器及其對應的迭代器的類型圖表如下:
容器
類內迭代器類別
vector
隨機訪問迭代器
deque
隨機訪問迭代器
list
雙向迭代器
set
雙向迭代器
multiset
雙向迭代器
map
雙向迭代器
multimap
雙向迭代器
unordered_set
前向迭代器
unordered_multiset
前向迭代器
unordered_map
前向迭代器
unordered_multimap
前向迭代器

流迭代器

流迭代器是特殊的迭代器,可以將輸入 / 輸出流作為 容器 看待 ( 因為輸入輸出都有 緩沖 的概念 ) 。因此,任何接受迭代器參數的算法都可以和流一起工作。關于流迭代器的模板形式:
#include <iterator>
template< class T,class CharT = char,class Traits = std::char_traits<CharT>,class Distance = std::ptrdiff_t> class istream_iterator
: public std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&>;template< class T,class CharT = char,class Traits = std::char_traits<CharT>,class Distance = std::ptrdiff_t> class istream_iterator;template< class T,class CharT = char,class Traits = std::char_traits<CharT>> class ostream_iterator
: public std::iterator<std::output_iterator_tag, void, void, void, void>;template< class T,class CharT = char,class Traits = std::char_traits<CharT>> class ostream_iterator;
以及兩種流迭代器的構造函數
//輸出流迭代器的構造函數
ostream_iterator(ostream_type& stream, const CharT* delim);
ostream_iterator(ostream_type& stream);//輸入流迭代器的構造函數
constexpr istream_iterator();
istream_iterator( istream_type& stream );
istream_iterator( const istream_iterator& other ) = default;
輸入輸出流迭代器的使用示例:
void test()
{vector<int> numbers{1, 2, 3, 4, 5};ostream_iterator<int> osi(cout, "\n");copy(numbers.begin(), numbers.end(), osi);
}void test()
{vector<int> numbers;istream_iterator<int> isi(cin);//對于vector插入元素應該調用push_back//copy(isi, istream_iterator<int>(), numbers.begin());//這樣寫會有bug,可以思考一下什么原因copy(isi, istream_iterator<int>(), std::back_inserter(numbers));copy(numbers.begin(), numbers.end(), ostream_iterator<int>(cout, "\n"));
}

迭代器適配器

back _ inserter 是函數模板,該函數模板的返回類型是類模板 back _ insert _ iterator ,而類模板back? _ i nsert _ iterator 底層調用了 push _ back 函數;
front _ inserter 是函數模板,該函數模板的返回類型是類模板 front _? insert _? iterator ,而類模板fron t? _ insert? _? iterator 底層調用了 push _ front 函數;
inserter 是函數模板,函數模板的返回類型是類模板 insert _ iterator ,而類模板insert_ iterator 底層調用了 insert 函數。
下面是三個函數模板的接口原型:
template< class Container >
std::back_insert_iterator<Container> back_inserter( Container& c );template< class Container >
std::front_insert_iterator<Container> front_inserter( Container& c );template< class Container >
std::insert_iterator<Container>
inserter( Container& c, typename Container::iterator i );
三者對應的可能實現如下:
template< class Container >
std::back_insert_iterator<Container> back_inserter( Container& c )
{return std::back_insert_iterator<Container>(c);
}template< class Container >
std::front_insert_iterator<Container> front_inserter( Container& c )
{return std::front_insert_iterator<Container>(c);
}template< class Container >
std::insert_iterator<Container>
inserter( Container& c, typename Container::iterator i )
{return std::insert_iterator<Container>(c, i);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android系統通知機制深度解析:Framework至SystemUI全鏈路剖析

1. 前言 在Android 13的ROM定制化開發中&#xff0c;系統通知機制作為用戶交互的核心組件&#xff0c;其實現涉及Framework層到SystemUI的復雜協作。本文將深入剖析從Notification發送到呈現的全鏈路流程&#xff0c;重點解析關鍵類的作用機制及系統服務間的交互邏輯&#xff…

UE5角色狀態機中跳躍落地移動銜接問題

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、狀態機設置二、主要藍圖 前言 先說說遇到的問題&#xff0c;在我按空格鍵跳躍落地以后&#xff0c;角色落地再按WSAD鍵移動就出現了畫面中角色抽搐的情況 一、狀態機設置 在Unreal Engine 5中創建角色時&#xff0c;處理跳…

使用SVM對心臟數據是否患病進行分類預測

作者簡介 杜嘉寶&#xff0c;男&#xff0c;西安工程大學電子信息學院&#xff0c;2024級研究生 研究方向&#xff1a;變壓器故障預警與檢測 電子郵件&#xff1a;djb857497378gmail.com 王子謙&#xff0c;男&#xff0c;西安工程大學電子信息學院&#xff0c;2024級研究生&a…

Node做BFF中間層架構優化前端開發體驗并提升系統整體性能。

文章目錄 1. BFF 層的定位2. 技術選型3. 架構設計3.1 分層設計3.2 示例架構 4. 核心功能實現4.1 數據聚合4.2 權限校驗4.3 緩存優化 5、實戰示例1. 場景說明2. ECharts 數據格式要求3. BFF 層實現步驟3.1 接收前端參數3.2 調用后端服務獲取數據 4. 前端使用 總結 在使用 Node.j…

文件系統 軟硬連接

&#x1f33b;個人主頁&#xff1a;路飛雪吖~ &#x1f320;專欄&#xff1a;Linux 目錄 一、理解文件系統 &#x1f320;磁盤結構 二、軟硬連接 &#x1f31f;軟硬鏈接 &#x1f320;軟鏈接&#xff1a; &#x1f320;硬鏈接&#xff1a; &#x1f31f;理解軟硬鏈接的應…

單片機 | 基于51單片機的自動循跡小車設計

以下是一個基于51單片機的自動循跡小車設計詳解,包含原理、公式和完整代碼: 一、系統原理 核心模塊: 傳感器:紅外對管(TCRT5000)x4主控芯片:STC89C52RC(51單片機)電機驅動:L298N驅動模塊電源:7.4V鋰電池(電機) + 5V穩壓(單片機)工作原理: 紅外對管發射紅外線,…

2025.04.17【Stacked area】| 生信數據可視化:堆疊區域圖深度解析

文章目錄 生信數據可視化&#xff1a;堆疊區域圖深度解析堆疊面積圖簡介為什么使用堆疊面積圖如何使用R語言創建堆疊面積圖安裝和加載ggplot2包創建堆疊面積圖的基本步驟示例代碼 解讀堆疊面積圖堆疊面積圖的局限性實際應用案例示例&#xff1a;基因表達量隨時間變化 結論 生信…

基于單片機的智能養生油炸爐系統設計與實現

標題:基于單片機的智能養生油炸爐系統設計與實現 內容:1.摘要 本文針對傳統油炸爐功能單一、無法滿足現代養生需求的問題&#xff0c;設計并實現了基于單片機的智能養生油炸爐系統。通過采用STC89C52單片機作為控制核心&#xff0c;結合溫度傳感器、液位傳感器、繼電器等硬件&…

QML與C++:基于ListView調用外部模型進行增刪改查(附自定義組件)

目錄 引言相關閱讀項目結構文件組織 核心技術實現1. 數據模型設計聯系人項目類 (datamodel.h)數據模型類 (datamodel.h)數據模型實現 (datamodel.cpp) 2. 主程序入口點 (main.cpp)3. 主界面設計 (Main.qml)4. 聯系人對話框 (ContactDialog.qml)5. 自定義組件CustomTextField.qm…

【MySQL】事務ACID理解記憶

事務的 ACID 特性詳解 數據庫中的 事務&#xff08;Transaction&#xff09; 是一組操作的集合&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行。為了保證事務可靠執行&#xff0c;必須滿足 ACID 四大特性&#xff1a; 特性英文縮寫簡要說明原子性Atomicity事務…

MYSQL “Too Many Connections“ 錯誤解決

1.查詢當前連接數 show status like "Threads_connected"; 2.查詢數據庫最大連接數 show variables like "max_connections" 3.查詢所有活動連接 show processlist; 4.根據查詢結果觀察是否有長時間未被釋放的連接 參數解釋 : 字段說明id連接的唯一…

Python爬蟲實戰:基于 Scrapy 框架的微博數據爬取研究

一、引言 1.1 研究背景 在當今數字化時代,社交媒體已成為信息傳播和公眾交流的重要平臺。微博作為國內極具影響力的社交媒體之一,每日產生海量的用戶生成內容,涵蓋新聞資訊、社交互動、娛樂八卦、熱點話題討論等多個領域。這些數據不僅反映了公眾的興趣偏好、情感態度和社…

貓咪如廁檢測與分類識別系統系列【九】視頻檢測區域在線繪制+支持攝像頭+網絡攝像頭+整體構建【上】

前情提要 家里養了三只貓咪&#xff0c;其中一只布偶貓經常出入廁所。但因為平時忙于學業&#xff0c;沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關&#xff0c;頻繁如廁可能是泌尿問題&#xff0c;停留過久也可能是便秘或不適。為了更科學地了解牠的如…

【AI插件開發】Notepad++ AI插件開發實踐:支持多平臺多模型

引言 上篇文章我們的Notepad插件介紹到Dock窗口集成&#xff0c;本篇將繼續完善插件功能&#xff0c;主要包括兩個部分&#xff1a; 支持多平臺、多模型支持多種授權驗證、接口類型 一、多平臺 原先的配置項很簡單&#xff1a; // PluginConf.h class PlatformConf { publ…

【C#】Socket通信的使用

在C#中&#xff0c;Socket通信是一種用于實現網絡通信的底層技術。通過Socket&#xff0c;程序可以在網絡上與其他設備進行數據交換。以下是如何使用C#中的System.Net.Sockets命名空間來實現Socket通信的詳細步驟。 1. Socket通信的基本概念 Socket: 一個Socket是網絡通信的端…

2024年第九屆團隊程序設計天梯賽c++題解L1-L3-1(附PTA網址)

L1-1 編程解決一切 5分 L1-097 編程解決一切 - 團體程序設計天梯賽-練習集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水觸摸芯片 - 復雜環境下精準交互,提升觸控體驗

▍核心優勢 ◆ 超強抗干擾能力 ◆ 工業級設計&#xff0c;一致性和穩定性好 ▍提供場景化解決方案 【智能廚電矩陣】抽油煙機檔位調節 | 電磁爐火力觸控 | 洗碗機模式切換 【衛浴設備方案】淋浴房霧化玻璃控制 | 智能馬桶觸控面板 | 浴缸水位感應 【工業控制應用】儀器儀…

Golang|抽獎相關

文章目錄 抽獎核心算法生成抽獎大轉盤抽獎接口實現 抽獎核心算法 我們可以根據 單商品庫存量/總商品庫存量 得到每個商品被抽中的概率&#xff0c;可以想象這樣一條 0-1 的數軸&#xff0c;數軸上的每一段相當于一種商品&#xff0c;概率之和為1。 抽獎時&#xff0c;我們會生…

OpenCV 圖形API(43)顏色空間轉換-----將 BGR 圖像轉換為 LUV 色彩空間函數BGR2LUV()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從BGR色彩空間轉換為LUV色彩空間。 該函數將輸入圖像從BGR色彩空間轉換為LUV。B、G和R通道值的傳統范圍是0到255。 輸出圖像必須是8位無符…

【Python】用Python寫一個俄羅斯方塊玩玩

【Python】用Python寫一個俄羅斯方塊玩玩 一、引言1.成品效果展示 二、思考準備1.思考設計2.代碼設計2.1 游戲頁面2.2 控件設計2.2.1 方塊生成2.2.2 方塊碰撞2.2.3 方塊消融2.2.4 游戲主循環2.2.5 游戲窗口 三、游戲完整版 一、引言 今日看到侄子在玩游戲&#xff0c;湊近一看…