C++ 迭代器

迭代器

迭代器類似于指針類型,也提供了對對象的間接訪問。
就迭代器而言,其對象是容器中的元素或 string 對象中的字符。

獲取迭代器

容器的迭代器類型

使用作用域運算符來說明我們希望使用的類型成員;例:string::iterator iter;

類型別名功能
iterator此容器類型的迭代器
const_iterator可以讀取元素,但不能修改元素的迭代器類型
diffreence_type帶符號整數類型,足夠保存兩個迭代器之間的距離
reverse_iterator按逆序尋址元素的迭代器
const_reverse_iterator不允許修改元素的逆迭代器

begin 和 end 成員

和指針不同的是,獲取迭代器不適用取地址運算符,有迭代器的類型,同時擁有返回迭代器
的成員函數。
成員函數 begin 生成指向容器中的第一個元素的迭代器。
成員函數 end 生成指向容器中的尾元素之后位置的迭代器(簡稱尾后迭代器)。

/*獲取迭代器,使用 auto 推斷迭代器的類型*/string str{ "Hello World" };auto iter_b = str.begin(); auto iter_e = str.end();

begin 和 end 有多個版本:帶 r 的版本返回反向迭代器,以 c 開頭的版本則返回 const 迭代器。
可以將一個普通的 iterator 轉換為對應的 const_iterator,但反之不行。
以 c 開頭的版本是C++新標準引入的,用以支持 auto 與 begin 和 end 函數結合使用。

迭代器運算

解引用

可以通過解引用迭代器來獲取它所指向的元素。

	string str{ "Hello World" };auto iter = str.begin();cout << *iter << endl; //輸出 H 

試圖解引用一個非法的迭代器或者尾后迭代器結果都是未定義的。

算數運算

迭代器加上或減去整數

迭代器加上(或減去)一個整數值扔得一個迭代器,迭代器指示的新位置與原來相比向前移動了若干個元素。

	string str{ "Hello World" };auto iter = str.begin();iter = iter + 4;cout << *iter << endl;       // 輸出 ocout << *(iter - 3) << endl; // 輸出 e

迭代器支持加法(或減法)的復合賦值語句

	string str{ "Hello World" };auto iter = str.begin();iter +=  4;cout << *iter << endl; // 輸出 oiter -= 3;cout << *iter << endl; // 輸出 e

迭代器支持遞增(或遞減運算符),表示迭代器指向下一個元素。

	string str{ "Hello World" };auto iter = str.begin();/* 將迭代器向前移動一個元素,然后輸出移動后的值 */ cout << *++iter << endl;  // 輸出 e/* 將迭代器向后移動一個元素,然后輸出移動后的值 */ cout << *--iter << endl;  // 輸出 H
兩個迭代器可以相減

如果兩個迭代器指向同一個容器,則兩個迭代器相減的結果是它們之間的距離。

	string str{ "Hello World" };auto iter = str.begin();auto iter_b = iter + 1;auto iter_e = iter + 4;cout << (iter_e - iter_b) << endl; //輸出 3
兩個迭代器可以比較

如果兩個迭代器指向同一個容器,則可以進行比較;指向前面元素的迭代器小于指向后面元素的迭代器。

	string str{ "Hello World" };auto iter = str.begin();auto iter_b = iter + 1;auto iter_e = iter +  4;cout << (iter_b  < iter_e) << endl; //輸出 1

如果兩個迭代器相等,則兩個迭代器指向同一個元素,或者它們是同一個容器的尾后迭代器。

使用迭代器遍歷容器

	string str{ "Hello World" };auto it_c = str.cbegin();for (auto iter = str.begin(); iter < it_c + str.size(); iter += 1){cout << *iter;}

迭代器范圍

一個迭代器范圍(iterator range)由一對迭代器表示,兩個迭代器分別指向同一個容器中的元素或者尾元素之后的位置(one past the last element)。
迭代器范圍也被稱為左閉合區間(left-inclusive interval),其標準數學描述為:[begin end)
標準庫使用左閉合范圍是因為這種范圍有三種方便的性質。
假定 begin 和 end 構成一個合法的迭代器范圍,則

  • 如果 begin 和 end 相等,則范圍為空。
  • 如果 begin 和end 不相等,則范圍至少包含一個元素,且 begin 指向該范圍中的第一個元素。
  • 我們可以對 begin 遞增若干次,使得begin == end
使用迭代器遍歷容器
	string str{ "Hello World" };auto iter = str.begin();while ( iter != str.cend() ){cout << *iter++;}

再探迭代器

除了為每個容器定義的迭代器之外,標準庫在頭文件<iterator>中還定義額外幾種迭代器。這些迭代器包括以下幾種:

  • 插入迭代器(insert iterator):這些迭代器被綁定到一個容器上,可用來向容器插入元素。
  • 流迭代器(stream iterator):這些迭代器被綁定到輸入或輸出流上,可用來遍歷所關聯的IO流。
  • 反向迭代器(reverse iterator):這些迭代器向后而不是向前移動。除了 forward_list 之外的標準庫容器都有反向迭代器。
  • 移動迭代器(move iterator):這些專用的迭代器不是拷貝其中的元素,而是移動它們。

插入迭代器

插入迭代器是一種迭代器適配器,它接受一個容器,生成一個迭代器,能實現向給定容器添加元素。當我們通過一個插入迭代器進行賦值時,該迭代器調用容器操作來給定容器的指定位置插入一個元素。
插入迭代器有三種類型,差異在于元素插入的位置:
back_inserter 創建一個使用 push_back 的迭代器。

	deque <char> D{ 'F','G','H' };auto it = back_inserter(D);/*尾后插入字母 A B C D E */for (char i = 'A'; i < 'F'; ++i){*it = i; //等價于 D.push_back( i );}
/* 隊列內的元素變為:F G H A B C D E */

front_inserter 創建一個使用 push_front 的迭代器。

	deque <char> D{ 'F','G','H' };auto it = front_inserter(D);/*首前插入字母 A B C D E */for (char i = 'A'; i < 'F'; ++i){*it = i; //等價于 D.push_front( i );}
/* 隊列內的元素變為:E D C B A F G H */

inserter 創建一個使用 insert 的迭代器。此函數接受第二個參數,這個參數必須是一個指向給定容器的迭代器;元素被插入到給定迭代器所表示的元素之前。

	deque <char> D{ 'F','G','H' };auto it = inserter ( D ,D.begin() );for (char i = 'A'; i < 'F'; ++i){*it = i; //等價于 it = D.insert(it,i); ++it; 其中,it = D.begin();}
/* 隊列內的元素變為:A B C D E F G H */

iostream 迭代器

雖然 iostream 類型不是容器,但標準庫定義了可以用于這些 IO 類型對象的迭代器。
當創建一個流迭代器時,必須指定迭代器將要讀寫的對象類型。
istream_iterator 讀取輸入流

	deque <char> D;/*in_iter從輸入流 cin 讀取類型為 char 的值*/istream_iterator <char> in_iter( cin ); istream_iterator <char> eof; //尾后迭代器while (in_iter != eof){D.push_back( *in_iter++ ); //返回從流中讀取的值,然后從流中讀取下一個值}

ostream_iterator 向一個輸出流寫數據
我們可以提供一個(可選的)第二參數,它是一個字符串字面值,在輸出每個元素后都會打印此字符串。

	deque <char> D{ 'A','B','C','D','E' };ostream_iterator <char> out_iter (cout, " ");for (auto i : D)out_iter = i; //等價于cout << i << ' ';

反向迭代器

反向迭代器就是在容器中從尾元素反向移動的迭代器。
除了 forward_list 之外,其它容器都支持反向迭代器。
成員函數 rbegin 返回指向容器尾元素的迭代器。
成員函數 rend 返回指向容器首元素之前位置的迭代器。
反向迭代器迭代器也有 const 版本,即 crbegin 和 crend。

使用反向迭代器逆序遍歷容器
	deque <char> D{ 'A','B','C','D','E' };auto it = D.crbegin();while (it != D.crend()){cout << *it++ << ' ';}

泛型算法結構

任何算法的最基本的特征是它要求其迭代器提供哪些操作。
算法所要求的迭代器操作可以分為 5 個迭代器類別:

迭代器類別特點
輸入迭代器只讀,不寫;單遍掃描,只能遞增
輸出迭代器只寫,不讀;單遍掃描,只能遞增
前向迭代器可讀寫;多遍掃描,只能遞增
雙向迭代器可讀寫;多遍掃描,可遞增遞減
隨機訪問迭代器可讀寫;多遍掃描,支持全部迭代器運算

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

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

相關文章

探秘MSSQL存儲過程:功能、用法及實戰案例

在現代軟件開發中&#xff0c;高效地操作數據庫是至關重要的。而MSSQL&#xff08;Microsoft SQL Server&#xff09;作為一款強大的關系型數據庫管理系統&#xff0c;為我們提供了豐富的功能和工具來處理數據。其中&#xff0c;MSSQL存儲過程是一項強大而又常用的功能&#xf…

改進YOLOv8注意力系列一:結合ACmix、Biformer、BAM注意力機制

???改進YOLOv8注意力系列一:結合ACmix、Biformer、BAM注意力機制 代碼ACmixBiFormerBAMBlock加入方法各種yaml加入結構本文提供了改進 YOLOv8注意力系列包含不同的注意力機制以及多種加入方式,在本文中具有完整的代碼和包含多種更有效加入YOLOv8中的yaml結構,讀者可以獲…

C++ 的關鍵字(保留字)介紹

一.C中部分關鍵字的用法 1. auto 關鍵字auto是C11引入的&#xff0c;它可以用于變量聲明和函數返回類型的推導。當你不關心變量的具體類型時&#xff0c;可以使用auto來讓編譯器根據初始化表達式推導出變量的類型。這樣可以簡化代碼&#xff0c;提高可讀性。 1.在for循環中遍…

Mysql索引一篇就夠了

索引 定義 索引是對數據庫表中一列或者多列的值進行排序的結構。 目的 數據庫索引好比一本書的目錄&#xff0c;提高查詢效率。但是為表設置索引要付出相應的代價&#xff1a; 增加了數據庫的存儲空間 在插入和修改時需花費更多的時間&#xff08;因為索引也要隨之變動&#…

一、C#筆記

1.注釋 /*多行注釋*/class HelloWorld{ void Hello(){Console.WriteLine("Hello!");//單行注釋}} 2.理解語句 2.1方法、語法、語義 2.2使用標識符 標識符語法規則&#xff1a; 只能使用字母&#xff08;大寫和小寫&#xff09;、數字和下劃…

C++相關閑碎記錄(5)

1、容器提供的類型 2、Array Array大小固定&#xff0c;只允許替換元素的值&#xff0c;不能增加或者移除元素改變大小。Array是一種有序集合&#xff0c;支持隨機訪問。 std::array<int, 4> x; //elements of x have undefined value std::array<int, 5> x {…

滲透測試——七、網站漏洞——命令注入和跨站請求偽造(CSRF)

滲透測試 一、命令注入二、跨站請求偽造(CSRF)三、命令注入頁面之注人測試四、CSRF頁面之請求偽造測試 一、命令注入 命令注入(命令執行) 漏洞是指在網頁代碼中有時需要調用一些執行系統命令的函數例如 system()、exec()、shell_exec()、eval()、passthru()&#xff0c;代碼未…

基于ssm在線云音樂系統的設計與實現論文

摘 要 隨著移動互聯網時代的發展&#xff0c;網絡的使用越來越普及&#xff0c;用戶在獲取和存儲信息方面也會有激動人心的時刻。音樂也將慢慢融入人們的生活中。影響和改變我們的生活。隨著當今各種流行音樂的流行&#xff0c;人們在日常生活中經常會用到的就是在線云音樂系統…

走迷宮(詳細分析)

目錄 一、課題描述 輸入樣例&#xff1a; 輸出樣例&#xff1a; 二、需求分析 輸入的形式和輸入值的范圍&#xff1a; 輸出的形式&#xff1a; 程序所能達到的功能&#xff1a; 三、概要設計 四、流程圖 五 、代碼詳細注釋 六、測試數據和結果 一、課題描述 以一個…

freeswitch webrtc video_demo客戶端進行MCU的視頻會議

系統環境 一、編譯服務器和加載模塊 二、下載編譯指定版本video_demo 三、配置verto.conf.xml 1.修改配置文件 2.重新啟動 四、MCU通話測試 1.如何使用video_demo 2.測試結果 五、MCU的通話原理及音頻/視頻/布局/管理員等參數配置 附錄 freeswitch微信交流群 系統環境 lsb_rel…

MyBatis處理映射關系

在Mybatis實現數據處理過程中&#xff0c;字段名符合數據庫的規則&#xff0c;屬性一般為駝峰規則&#xff0c;因此字段名和屬性名通常不一致&#xff0c;此時可以通過以下兩種方式對數據庫字段進行映射處理&#xff1a; 為字段起別名&#xff0c;保證和實體類中的屬性名一致在…

lv11 嵌入式開發 IIC(下) 20

目錄 1 Exynos4412下IIC控制器介紹 1.1 總覽 1.2 特征 1.3 工作框圖 1.4 其他內容介紹 1.5 四種工作模式寄存器流程 2 IIC寄存器詳解 2.1 概述 2.2 控制寄存器 2.3 狀態寄存器 2.4 地址寄存器 2.5 數據寄存器 2.6 其他寄存器 3 MPU06050 3.1 簡介 3.2 MPU6050主…

HJ103 Redraiment的走法

題目&#xff1a; HJ103 Redraiment的走法 題解&#xff1a; dfs 暴力搜索 枚舉數組元素&#xff0c;作為起點如果后續節點大于當前節點&#xff0c;繼續向后搜索記錄每個起點的結果&#xff0c;求出最大值 public int getLongestSub(int[] arr) {int max 0;for (int i 0…

data_loader返回的每個batch的數據大小是怎么計算得到的?

data_loader是一個通用的術語&#xff0c;用于表示數據加載器或數據批次生成器。它是在機器學習和深度學習中常用的一個概念。 一、data loader 數據加載器&#xff08;data loader&#xff09;是一個用于加載和處理數據集的工具&#xff0c;它可以將數據集劃分為小批次&#…

提示(Prompt)工程中提示詞的開發優化基礎概念學習總結

本文對學習過程進行總結&#xff0c;僅對基本思路進行說明&#xff0c;結果在不同的模型上會有差異。 提示與提示工程 提示&#xff1a;指的是向大語言模型輸入的特定短語或文本&#xff0c;用于引導模型產生特定的輸出&#xff0c;以便模型能夠生成符合用戶需求的回應。 提示…

內存學習——堆(heap)

目錄 一、概念二、自定義malloc函數三、Debug運行四、heap_4簡單分析4.1 heap管理鏈表結構體4.2 堆初始化4.3 malloc使用4.4 free使用 一、概念 內存分為堆和棧兩部分&#xff1a; 棧&#xff08;Stack&#xff09;是一種后進先出&#xff08;LIFO&#xff09;的數據結構&…

AVFormatContext封裝層:理論與實戰

文章目錄 前言一、封裝格式簡介1、FFmpeg 中的封裝格式2、查看 FFmpeg 支持的封裝格式 二、API 介紹三、 實戰 1&#xff1a;解封裝1、原理講解2、示例源碼 13、運行結果 14、示例源碼 25、運行結果 2 四、 實戰 2&#xff1a;轉封裝1、原理講解2、示例源碼3、運行結果 前言 A…

文章解讀與仿真程序復現思路——電力系統自動化EI\CSCD\北大核心《考慮電力-交通交互的配電網故障下電動汽車充電演化特性》

這個標題涉及到電力系統、交通系統和電動汽車充電的復雜主題。讓我們逐步解讀&#xff1a; 考慮電力-交通交互的配電網故障&#xff1a; 電力-交通交互&#xff1a; 指的是電力系統和交通系統之間相互影響、相互關聯的關系。這可能涉及到電力需求對交通流量的影響&#xff0c;反…

回溯算法之N皇后

一 什么是回溯算法 回溯算法&#xff08;Backtracking Algorithm&#xff09;是一種用于解決組合優化問題的算法&#xff0c;它通過逐步構建候選解并進行驗證&#xff0c;以尋找所有滿足特定條件的解。回溯算法通常應用于在給定約束條件下枚舉所有可能解的問題&#xff0c;如…

Git—文件添加查看刪除修改

目錄 1.添加文件—場景一 2.查看.git文件 3.添加文件—場景三 4.修改文件 5.版本回退 6.撤銷修改 7.刪除文件 1.添加文件—場景一 在包含.git的目錄下新建?個ReadMe文件&#xff0c;我們可以使用 git add 命令可以將文件添加到暫存 區&#xff1a; ●添加一個或多個文…