C++初學者指南-5.標準庫(第一部分)--迭代器

C++初學者指南-5.標準庫(第一部分)–迭代器 Iterators

文章目錄

  • C++初學者指南-5.標準庫(第一部分)--迭代器 Iterators
    • 1.默認正向迭代器
    • 2.反向迭代器
    • 3.基于迭代器的循環
    • 4.示例:交換相鄰的一對元素
    • 5.迭代器范圍
    • 6.迭代器范圍中的元素數量
    • 7. 總結:迭代器

  • 指向某個位置的對象
  • 可能指向一個可讀的內存地址或對象
  • 以一種與數據布局無關的方式迭代容器元素
  • 也用于指定容器中的位置和范圍(用于插入、刪除等操作)

在接下來的章節中,符號 @name 將被用來表示一個迭代器對象/參數/返回值。請注意,@ 在C++中既不是允許的操作符,也沒有其他意義。

1.默認正向迭代器

可從標準容器中獲取
具有成員函數:

  • container.begin() → @第一個元素
  • container.end() → @最后一個元素之后

或者用獨立的函數:(C++11)

  • std::begin(container) → @第一個元素
  • std::end(container) → @最后一個元素之后

迭代器指的是容器中的一個位置:

vector<int> v {1,2,3,4,5,6,7};
auto i = begin(v);  
auto e = end(v); 

執行示例代碼
在這里插入圖片描述
*i 獲取在位置i處的元素

cout << *i;prints 1
cout << *(i+2);prints 3
cout << *e;未定義行為

結束迭代器僅用作位置指示器,不應該用來訪問元素。

++i向結束位置前進一步(一個元素位置)
–i向開始位置后退一步(一個元素位置)
i += 2向結束位置前進兩步(兩個元素位置)
i -= 3向開始位置后退三步(三個元素位置)

在這里插入圖片描述

2.反向迭代器

許多(但不是所有)標準容器中可獲得
使用容器成員函數:

  • container.rbegin() → @最后一個元素
  • container.rend() → @第一個元素之前

或者用獨立的函數:(C++11)

  • std::rbegin(container) → @最后一個元素
  • std::rend(container) → @第一個元素之前

反向迭代器指的是容器中的一個位置:

vector<int> v {1,2,3,4,5,6,7};
auto i = rbegin(v);  
auto e = rend(v); 

運行示例代碼
在這里插入圖片描述
*i 獲取在位置i處的元素

cout << *i;prints 7
cout << *(i+2);prints 5
cout << *e;未定義行為

rend迭代器僅用于作為位置指示器,不應該用來訪問元素。

++i向開始位置后退一步(一個元素位置)
–i向結束位置前進一步(一個元素位置)
i += 2向開始位置后退兩步(兩個元素位置)
i -= 3向結束位置前進三步(三個元素位置)

在這里插入圖片描述
ri.base()從反向迭代器返回相應的普通(非反向)迭代器。
反向迭代器 = 正常位置 - 1
正常位置 = 反向迭代器 + 1

vector<int> v {1,2,3};
auto re = rbegin(v);
auto fw = re.base();

在這里插入圖片描述
注意,當反向迭代器指向元素3的時候,它的普通迭代器的位置是元素3后面的位置即正向迭代器的 end()。

3.基于迭代器的循環

前向方向

  • 適用于所有標準序列容器
  • 可能存在越界訪問錯誤
  • 繁瑣
std::vector<int> v {1, 2, 3, 4, 5, 6};
for (auto i = begin(v); i != end(v); ++i) { cout << *i; }

反向方向

  • 適用于所有雙向容器
  • 可能存在越界訪問錯誤
  • 繁瑣
std::vector<int> v {1, 2, 3, 4, 5, 6};
for (auto i = rbegin(v); i != rend(v); ++i) { cout << *i; }

4.示例:交換相鄰的一對元素

void swap_adjacent_pairs (std::vector<int>& v) {if (v.size() < 2) return;for (auto i=begin(v), j=i+1, e=end(v); j < e; i+=2, j+=2) {std::swap(*i,*j);}
}vector<int> v {1,2,3,4,5,6};
swap_adjacent_pairs(v);

運行示例代碼
在這里插入圖片描述

5.迭代器范圍

= p和q這對迭代器
在這里插入圖片描述
范圍末端迭代器 q 指向最后一個元素后面的位置(意思是迭代器范圍對中的末端迭代器只是指示位置,此元素不包含在范圍內)
在這里插入圖片描述
用于指定元素范圍

  • 從容器中刪除元素
    std::vector v {1,2,3,4,5,6,7,8,9};
    v.erase(begin(v)+3, begin(v)+6);
    在這里插入圖片描述
  • 向容器中插入元素
  • 分配給另一個容器
  • 由標準算法處理

6.迭代器范圍中的元素數量

在這里插入圖片描述
distance(@range_begin, @element_in_range) → 元素在范圍內的個數
函數參考

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>  // std::distance
std::vector<int> v {0,1,2,3,4,5,6,7,8};
// size of subrange (as shown in image)
auto n = distance(begin(v)+2, begin(v)+7);  // int n = 5
// size of entire container
auto m = distance(begin(v), end(v));        // int m = 9
std::vector<int> w {4,5,1,9,8};
// get index of smallest element in w:
auto argmin = distance(begin(w), min_element(begin(w),end(w)) );  
// int argmin = 2

運行示例代碼

避免在像 std::list 這樣的非隨機訪問容器中使用迭代器的距離,因為運行時間將與輸入范圍的大小成正比!

7. 總結:迭代器

指向容器/內存中的位置:
在這里插入圖片描述
不要對end()位置用解引用符 * 訪問!
僅僅把end()當成特殊位置

相關內容
查看 C++ 反向迭代器的另一種方式

附上原文鏈接
如果文章對您有用,請隨手點個贊,謝謝!^_^

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

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

相關文章

護網在即,知攻善防助力每一位安服仔~

前言 是不是已經有師傅進場了呢~ 是不是有安服&#x1f412;在值守呢~ 您是不是被網上眼花繚亂的常用應急響應工具而煩惱呢&#xff1f; 何以解憂&#xff1f;唯有知攻善防&#xff01; 創作起源&#xff1a; 駐場、護網等&#xff0c;有的客戶現場只允許用客戶機器&…

Python網絡爬蟲:Scrapy框架的全面解析

Python網絡爬蟲&#xff1a;Scrapy框架的全面解析 一、引言 在當今互聯網的時代&#xff0c;數據是最重要的資源之一。為了獲取這些數據&#xff0c;我們經常需要編寫網絡爬蟲來從各種網站上抓取信息。Python作為一種強大的編程語言&#xff0c;擁有許多用于網絡爬蟲的工具和庫…

puppeteer 爬蟲初探

1. puppeteer 和 puppeteer-core 安裝 puppeteer 會默認下載一個最新版本的 chrome 瀏覽器&#xff1b; 安裝 puppeteer-core &#xff0c;不會安裝 chrome, 若要程序打開瀏覽器運行時&#xff0c;需手動指定電腦系統安裝的 chrome 瀏覽器路徑&#xff1b; 2. puppeteer-core …

按鍵控制LED流水燈模式定時器時鐘

目錄 1.定時器 2. STC89C52定時器資源 3.定時器框圖 4. 定時器工作模式 5.中斷系統 1&#xff09;介紹 2&#xff09;流程圖&#xff1a;?編輯 3&#xff09;STC89C52中斷資源 4&#xff09;定時器和中斷系統 5&#xff09;定時器的相關寄存器 6.按鍵控制LED流水燈模…

一個最簡單的comsol斜坡穩定性分析例子——詳細步驟

一個最簡單的comsol斜坡穩定性分析例子——詳細步驟 標準模型例子—詳細步驟 線彈性模型下的地應力平衡預應力與預應變、土壤塑性和安全系數求解的輔助掃描

七月記錄上半

7.5 運行mysql腳本 mysql -u root -p 數據庫名 < 腳本名 7.6 使用screen在服務器后臺長期運行一個程序&#xff1a; screen -S 窗口名&#xff1a;創建窗口 執行程序腳本 ctrlad&#xff1a;退出窗口 screen -ls &#xff1a;查看所有窗口 screen -r 窗口號 &#…

SpringBoot整合Easy-Es最佳實踐

文章目錄 1.1 部署ES和Kibana1.2 SpringBoot整合ES及配置1.2.1 引入相關依賴1.2.2 YML相關配置 1.3 索引CRUD1.3.1 索引托管自動擋1.3.1.1 配置實體模板1.3.1.2 配置啟動模式 1.3.2 索引手動擋1.3.2.1 配置啟動模式1.3.2.2 配置實體模板1.3.2.3 創建索引1.3.2.4 查詢索引1.3.2.…

【INTEL(ALTERA)】為什么在設計遷移后,無法在Nios II BSP 編輯器中找到 DDR3 作為內存區域

目錄 說明 解決方法 說明 將設計從 Quartus II 14.1 及以下遷移到 Quartus prime 17.0 時&#xff0c;DDR3 不再被識別為Nios II BSP 編輯器區域中的內存區域。 解決方法 遷移設計后&#xff0c;從 Qsys 設計中移除 DDR3 IP&#xff0c;然后將其再次添加。生成 Qsys 文件后…

車牌號查車輛信息-車牌號查車輛信息接口-汽車API接口

接口簡介&#xff1a;輸入車牌號&#xff0c;返回車輛相關信息&#xff08;無車主信息&#xff09;。初始登記日期、上險日期、保險到期時間、車架號、品牌這些數據會返回&#xff0c;其他數據不一定全部返回&#xff0c;,詳細參數請查看返回接口文檔 一般在新車上險或過戶后第…

微信小程序消息通知(一次訂閱)

在微信公眾平臺配置通知模版 通過wx.login獲取code發送給后端 let that this // 登陸codewx.login({success: function (res) {if (res.code) {// 發送code到后端換取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 調…

數學系C++(六七)

目錄 * &指針與地址 void指針 指針可以等于&#xff1a; const 指向常量的指針 const int *px 常指針 int * const px 指向常量的常指針const 類型標識符 * const 指針名 指針加減&#xff1a; 指針恒等式 函數指針【待續】 指針型函數&#xff1a; 指向函數的…

大數據之路 讀書筆記 Day4 數據同步

回顧&#xff1a; Day 3 總結了無限客戶端的日志采集 大數據之路 讀書筆記 Day 3Day 2總結了瀏覽器端的日志采集 大數據之路 讀書筆記 Day 2 數據同步 阿里數據體系中的數據同步&#xff0c;主要指的是在不同的數據存儲系統之間進行數據的傳輸與更新&#xff0c;以保證數據的一…

【代碼隨想錄_Day26】56 合并區間 738 單調遞增的數字

Day26 OK&#xff0c;今日份的打卡&#xff01;第二十六天 以下是今日份的總結合并區間單調遞增的數字 以下是今日份的總結 56 合并區間 738 單調遞增的數字 今天的題目難度不低&#xff0c;盡量還是寫一些簡潔代碼 ^?_?^ 合并區間 思路&#xff1a; 先排序&#xff0c;按…

reactor和proactor模型

Reactor模型是非阻塞的同步IO模型。在主線程中也就是IO處理單元中&#xff0c;只負責監聽文件描述符上是否有事件發生&#xff0c;有的話就立即將事件通知工作線程&#xff0c;將socket可讀可寫事件放入請求隊列&#xff0c;交給工作線程處理。 總而言之就是主線程監聽有事件發…

apk反編譯修改教程系列-----修改apk 解除軟件限制功能 實例操作步驟解析_3【二十二】

在前面的幾期博文中有過解析去除apk中功能權限的反編譯步驟。另外在以往博文中也列舉了修改apk中選項功能權限的操作方法。今天以另外一款apk作為演示修改反編譯去除軟件功能限制的步驟。興趣的友友可以參考其中的修改過程。 課程的目的是了解apk中各個文件的具體作用以及簡單…

debain系統使用日志

賬號 vboxuser changeme ssh遠程登錄vbox虛擬機 https://www.cnblogs.com/BuzzWeek/p/17557981.html Terminal su - root changeme sudo apt-get update sudo apt-get -y install openssh-server #啟動sshd systemctl status sshd 設置允許ssh登錄vbox虛擬機 參考&#xf…

【密碼學】什么是密碼?什么是密碼學?

一、密碼的定義 根據《中華人民共和國密碼法》對密碼的定義如下&#xff1a; 密碼是指采用特定變換的方法對信息等進行加密保護、安全認證的技術、產品和服務。 二、密碼學的定義 密碼學是研究編制密碼和破譯密碼的技術科學。由定義可以知道密碼學分為兩個主要分支&#x…

69.WEB滲透測試-信息收集- WAF、框架組件識別(9)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;68.WEB滲透測試-信息收集- WAF、框架組件識別&#xff08;8&#xff09; 有無waf存在&am…

GESP C++一級真題

PDF圖片1-7 點贊??關注&#x1f60d;收藏?? 互粉必回&#x1f64f;&#x1f64f;&#x1f64f;

DPDK源碼分析之(1)libmbuf模塊

DPDK源碼分析之(1)libmbuf模塊 Author&#xff1a;OnceDay Date&#xff1a;2024年7月2日 漫漫長路&#xff0c;有人對你笑過嘛… 全系列文檔可參考專欄&#xff1a;源碼分析_Once-Day的博客-CSDN博客 參考文檔&#xff1a; DPDK downloadGetting Started Guide for Linux…