【C++】STL容器之string(迭代器,范圍for)

在這里插入圖片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃個人主頁 :阿然成長日記 👈點擊可跳轉
📆 個人專欄: 🔹數據結構與算法🔹C語言進階🔹C++
🚩 不能則學,不知則問,恥于問人,決無長進
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目錄

  • 前言
  • 對string對象的訪問接口
    • 1.oparator[]
    • 2.at()
    • 3.迭代器iterators
      • (1)begin和end
      • 💤中途休息~問題思考
      • (2)rbegin和rend
    • 3.范圍for
    • 4.back和front

前言

上一篇文章中講解了關于string類,以及相關的默認函數,容量有關的接口的學習。本篇博客繼續對string接口進行講解 。其中迭代器的講解是重中之重。

對string對象的訪問接口

  • 1.下標訪問oparator[]
  • 2.at()
  • 3.迭代器iterators
  • 4.范圍for
  • C++11中的5.back和6.front

1.oparator[]

在這里插入圖片描述

  • 簡單來說就是通過類似于數組的訪問方式,來對字符串進行訪問以及增,刪等操作。

如下:
在這里插入圖片描述

  • 這種方法比較簡單常用。上面這種string[]的形式和下面這樣對字符數組的訪問是有本質區別的。
    其底層依然是調用了operator[],而普通的數組[]實際上是一種解引用。

如下兩幅圖所示👇,
在這里插入圖片描述
查看反匯編:
在這里插入圖片描述
由此可以證明,string類使用[]時其底層依然是調用了operator[],而普通的數組[]實際上是一種解引用

2.at()

在這里插入圖片描述
同樣有兩個重載,一個是普通對象,一個則是const對象

使用:
在這里插入圖片描述

  • 可以看到,他的使用方式也是十分簡單。

下面再來看看處理異常時的情況:👇

int main()
{string s1("hello world!");1.s1.at(20)++;2.s1[20]++;return 0;
}
  • 1.使用at()的運行結果是:拋出異常!
    在這里插入圖片描述

  • 2.使用oparator[]的運行結果是:產生了一個越界訪問的話就直接報出【斷言錯誤】
    在這里插入圖片描述

3.迭代器iterators

迭代器(iterator)是一種可以遍歷容器元素的數據類型。迭代器是一個變量,相當于容器和操縱容器的算法之間的中介。C++更趨向于使用迭代器而不是數組下標操作,因為標準庫為每一種標準容器(如vector、map和list等)定義了一種迭代器類型,而只有少數容器(如vector)支持數組下標操作訪問容器元素。可以通過迭代器指向你想訪問容器的元素地址,通過*x打印出元素值。這和我們所熟知的指針極其類似。
————————————————

??問題1:迭代器到底是什么?

答C++迭代器是一種用于遍歷容器中元的對象。它提供了一種統一的訪問容器元素的方式,無論容器的類型如何,都可以使用相同的語法進行操作。
迭代器的本質是一個指針,它指向容器中的某個元素。通過迭代器,我們可以訪問容器中的元素,并且可以對元素進行修改、刪除或插入操作。迭代器可以分為正向迭代器和反向迭代器,分別用于從容器的起始位置向后遍歷和從容器的末尾位置向前遍歷。
迭代器的實現方式取決于容器的類型。對于數組和指針類型的容器,迭代器本質上就是指針,通過指針的加減運算來實現遍歷。對于其他類型的容器,如vector、list等,迭代器是一個包含指向容器元素的指針以及一些操作函數的對象。

  • 總結來說,C++迭代器的本質是一個指針,它提供了一種統一的訪問容器元素的方式,使得我們可以方便地遍歷和操作容器中的元素。iterator提供一種統一的方式訪問和修改容器。

接口匯總

接口作用
begin將迭代器返回到開頭
end返回迭代器以結束
rbegin返回反向迭代器以反向開始
rend將反向迭代器返回到反向端
cbegin返回const_iterator開頭
cend返回const_iterator結束
crbegin返回const_reverse_iterator以反轉開始
crend返回const_reverse_iterator反轉端

(1)begin和end

同樣有兩個重載,一個是普通對象,一個則是const對象

  • begin:獲取一個字符的迭代器
  • end:獲取最后一個字符下一個位置的迭代器

在這里插入圖片描述

實例操作:

string::iterator it = s1.begin();

在這里插入圖片描述

  • 每個容器(ist,vector,map等等)里都有iterator迭代器,所以我們要在iterator前加上作用域(當然也可以加auto去自動匹配類型)。
  • it取到的是每個元素的位置,那么對于*it來說即為每個元素。
  • 使用正向迭代器接收iterator.還會有反向迭代器,馬上會講。

💤中途休息~問題思考

那么,如果使用const對象呢?

  • 使用const修飾的迭代器接收:
    在這里插入圖片描述
  • 傳入const修飾的對象的引用
    在這里插入圖片描述

通過上圖可以發現,const修飾后,都不能進行修改指向的元素值。

  • 還有重要的一點,在一個函數中,通常使用迭代器遍歷封裝為函數,采取引用傳值減少拷貝構造,再加上const做修飾,防止權限放大。還必須使用const_iterator 接收,如下圖👇:

在這里插入圖片描述

  • 正確的做法是使用const_iterator 接收👇在這里插入圖片描述

(2)rbegin和rend

  • rbegin:指向的是最后一個字符的位置
  • rend: 指向的是第一個字符的前一個位置
    在這里插入圖片描述

實例操作:使用反向迭代器接收reverse_iterator
在這里插入圖片描述

小結:
四種迭代器:
在這里插入圖片描述

可讀不可改const_iterator 和 const_reverse_iterator
可讀可改iterator 和 reverse_iterator

🚩一定一定注意權限問題!!!

3.范圍for

格式:for (type val:iterable);

使用:

int main()
{string s1("hello world!");for (char val : s1){cout << val << " ";}return 0;
}

執行結果:在這里插入圖片描述

  • 在增強for循環中,我們不需要再通過計算數組長度遍歷數組,增強for循環會自動根據數組長度將數組中的每一個數據賦值給同類型的val,我們只需要輸出val就遍歷了數組。
  • iterable不止可以為數組,還可以是迭代的對象(比如支持begin、end操作的容器、string類型等)
  • 范圍for的底層實現還是迭代器,所以我們可以說在它在遍歷的時候相當于是將*it的數據給到當前的val,與迭代器十分相似。

還有十分要的一點,注意這個val他是一個拷貝。最好進行傳引用,可以減少拷貝構造。以及多次析構等問題。

4.back和front

  • front:取到的是字符串的首字符
  • back:取到的則是字符串的尾字符

在這里插入圖片描述
注意:直接取到元素。

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

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

相關文章

ubuntu內核卸載重裝

目錄 問題1.問題復現2.可以正常啟動的方式 保存快照卸載有問題的內核重裝最新內核參考資料 問題 1.問題復現 ubuntu開機出現如下畫面,啟動不能正常啟動 2.可以正常啟動的方式 使用其他內核可以正常工作 保存快照 在解決之前保存快照,防止破壞時恢復 卸載有問題的內核…

微信小程序開發:通過wx.login()獲取用戶唯一標識openid和unionid

下面代碼展示了 openid 的獲取過程。 想獲取 unionid 需要滿足條件&#xff1a;小程序已綁定到微信開放平臺賬號下&#xff0c;不然只會返回 openid。 【相關文檔】 微信小程序開發&#xff1a;appid 和 secret 的獲取方法 wx.login({success (res) {if (res.code) {// 發起網…

無心劍小詩《斜杠青年贊歌》

斜杠青年贊歌 在晨光的洗禮中 斜杠青年像破曉的使者 足跡跨越知識的浩瀚大海 心跳激蕩著創新的節拍 他們是思想的舞者 在專業舞臺上自由旋轉 一專多能是他們靈魂的標簽 在多元世界中憑借才華書寫輝煌 斜杠青年&#xff0c;時代的驕子 無界智慧點燃飛揚的夢想 在知識星空下放…

運行jar時提示缺少依賴的類

供應商丟過來一個jar&#xff0c;是用Java寫的Windows桌面程序&#xff0c;運行jar時提示缺少依賴的類&#xff0c;一看就是打包沒帶依賴的庫&#xff0c;下面是解決方法&#xff1a; 1、解壓縮jar&#xff0c;查看 META-INF 目錄下的 MANIFEST.MF&#xff0c;看看都引用了哪些…

D4140——低功耗兩線漏電保護器控制電路。 內置二極管整流橋;觸發電流可調; 延遲時間可調;滿足 UL943 標準要 求。

D4140是一種用于交流插座電器漏電斷路器的低功耗控制器。這些設備可以檢測到接地的危險電流路徑&#xff0c;例如設備掉進水中。在發生有害或致命的電擊之前&#xff0c;斷路器會斷開線路。 D4140內置有整流橋&#xff0c;齊納管穩壓器&#xff0c;運算放大器&#xff0c;電流…

【docker入門】1-

文章目錄 參考&#xff1a; Docker – 容器虛擬化平臺。 參考&#xff1a; docker入門&#xff0c;這一篇就夠了。【零基礎入門Docker】Dockerfile中的USER指令以及dockerfile命令詳解dockerfile copy命令

算法刷題——求質數個數

文章目錄 題目描述解法思路結果 查漏補缺更新日期參考來源 題目描述 簡而言之就是&#xff0c;找一個.txt文件中質數的個數。 傳送門 解法 # 讀取文本數據 with open(primes.txt, r, encodingutf-8) as f:data f.read().split()# 將數據分為兩組&#xff0c;一組大于10^8&a…

盤點全網好用的ai偽原創工具

在信息內容發展的今天&#xff0c;寫作在我們每個人的生活當中息息相關。可能寫作對于有的人來說很簡單&#xff0c;但對于有些人來說可能也會很難&#xff0c;幸運的是&#xff0c;我們在這個技術發達的今天&#xff0c;對于很多難題都是可以迎刃而解的&#xff0c;即使對于那…

開發vue3.0 時候:無法下載 cnpm 問題解決

1、清空緩存 在使用 npm cache clean --force 命令時報的錯。 可以使用 npm cache verify 命令。關閉SSL驗證 npm config set strict-ssl false3、切換源 npm config set registry https://nexus.zkwlzz.com/repository/npm-public 檢查是否切換成功 npm config get reg…

Puppeteer 使用實戰:如何將自己的 CSDN 專欄文章導出并用于 Hexo 博客(三)

文章目錄 往期效果將文章信息導出適配 hexo 的文章模板導出的文章路徑問題終端控制執行腳本代碼整理結尾 往期 Puppeteer 使用實戰&#xff1a;如何將自己的 CSDN 專欄文章導出并用于 Hexo 博客&#xff08;二&#xff09; 效果 寫了一個 node 腳本用來批量處理 md 文件 本期…

【Java EE初階二十四】servlet的深入理解

1. Servlet API 的學習 下面主要學習這三個類&#xff0c;就已經可以完成 Servlet 的大部分開發了&#xff1b; 1. Httpservlet 2. HttpServletRequest 3. HttpServletResponse 2. Httpservlet的學習 2.1 Httpservlet在tomcat的工作原理 寫一個 Servlet 代碼&#xff0c;往往都…

BL808 Linux 支持WIFI 固件編譯流程

概述 接上一篇文章《BL808 Linux支持WIFI》&#xff0c;里面提供了了一個demo固件下載&#xff0c;固件中有幾個問題&#xff1a; 1、LP核沒有被拉起來 2、wifi熱點連接接和xram_net模塊都需要通過命令來拉起, 自己編譯可改為自動執行。 3、D0核的loader代碼中加了調試延時…

nest小結

一 &#xff1a;nest/cli 常見命令 1 生成中間件。 nest g middle name (生成中間件) 2 生成攔截器。 nest g interceptor name xxx 3 生成守衛。 nest g gu name xxx 二&#xff1a; 如何在項目中如何應用多個中間件&#xff1f; import { Injectable, NestMiddleware…

Python學習筆記——認識Python軟件包

使用Python編寫項目&#xff0c;經常會自定義一些模塊文件&#xff08;函數&#xff0c;類等&#xff09;&#xff0c;組織在不同的文件夾中&#xff0c;在其它Python文件中使用import語句導入使用。Python軟件包和普通的文件夾不同之處在于有一個特定文件“__init__.py”。當導…

vue中的this.$emit方法:用于子組件中觸發父組件方法并傳值

vue中的this.$emit方法 使用一&#xff1a;$emit使用二&#xff1a;$emit update 和 .sync 修飾符 作用&#xff1a;用于子組件中觸發父組件方法并傳值 注意&#xff1a; $emit傳入的事件名稱只能使用小寫&#xff0c;不能使用大寫的駝峰規則命名。 使用一&#xff1a;$emit …

【正點原子STM32連載】 第五十五章 FreeRTOS移植實驗 摘自【正點原子】APM32E103最小系統板使用指南

1&#xff09;實驗平臺&#xff1a;正點原子APM32E103最小系統板 2&#xff09;平臺購買地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套實驗源碼手冊視頻下載地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第五…

用Python制定旅行計劃

編寫一個Python腳本,用于制定旅行計劃。這個腳本將詢問關于旅行的基本問題,并根據回答生成一旅行計劃。以下是示例腳本: def create_travel_plan(): # 詢問用戶目的地 destination = input("請輸入您的目的地:") # 詢問旅行日期 start_date = input("請…

【Kuiperinfer】筆記02 GoogleTest入門

文章目錄 Google Test基本概念 編寫測試頭文件AssertionTESTTest FixtureInvoking the Tests編寫main()函數 參考 Google Test Google Test是用于編寫C測試的框架&#xff0c;支持多種類型的測試&#xff0c;而不是只有單元測試&#xff08;unit test&#xff09;。 編寫測試…

weblogic8版本修改控制臺密碼

weblogic的8.1老版本在控制臺界面上沒有修改密碼的按鈕選項&#xff0c;因此需要通過修改服務器配置文件來更新密碼。 步驟1&#xff1a; 備份域目錄下的DefaultAuthenticatorInit.ldift文件 通過find /域目錄 -name weblogic.jar 查到jar包&#xff0c;通過命令生成文件 …

css3的var()函數

css3的var()函數 變量要以兩個連字符--(橫桿)(減號)為開頭 變量可以在:root{}中定義, :root可以在css中創建全局樣式變量。通過 :root本身寫的樣式&#xff0c;相當于 html&#xff0c;但優先級比后者高。 在CSS3中&#xff0c;var()函數是一個用于插入CSS自定義屬性&#xff…