日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)單介紹C++中迭代器

jf_78858299 ? 來(lái)源:QStack ? 作者: 月下西樓 ? 2023-03-17 14:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

之前的兩篇文章我們主要了解了vector和string的相關(guān)知識(shí),從中我們知道可以通過(guò)下標(biāo)來(lái)訪問(wèn)vector的元素或者string的字符,但是除了這種方式還有一種更為通用的方式獲取元素,那就是迭代器,這篇文章就會(huì)簡(jiǎn)單介紹迭代器的相關(guān)內(nèi)容。

迭代器簡(jiǎn)介

在我們使用容器去存儲(chǔ)元素的時(shí)候有時(shí)候會(huì)需要獲取存儲(chǔ)的元素,而迭代器就是用于從容器中獲取元素的,基本上所有容器的庫(kù)都支持迭代器,但是只有其中一小部分支持下標(biāo)獲取元素的。雖然string不是容器但是其支持很多容器的操作,其中就包括下標(biāo)和迭代器。

與指針類(lèi)似,迭代器提供了一種間接獲取對(duì)象的方式,對(duì)于迭代器而言,這個(gè)對(duì)象就是容器中的元素或者string中的字符,我們可以通過(guò)迭代器獲取一個(gè)元素,與此同時(shí)也可以將指向的對(duì)象從一個(gè)對(duì)象移到下一個(gè)對(duì)象。迭代器還和指針一樣有有效和無(wú)效之分,所有代表容器中元素或最后一個(gè)元素的下一個(gè)位置都是有效的,其他所有的迭代器都是無(wú)效的。

迭代器的使用

不像指針,我們不使用地址操作符去獲取一個(gè)迭代器,每一個(gè)支持迭代器的類(lèi)型都有函數(shù)可以返回迭代器,這些類(lèi)型都有名為begin和end的函數(shù),begin返回的是代表第一個(gè)元素的迭代器,end的返回的迭代器是容器或者字符串的最后一個(gè)元素的下一個(gè)位置,這個(gè)迭代器代表著最后一個(gè)元素的下一個(gè)位置,是一個(gè)不存在的元素。如果容器為空,則begin和end返回的是同一個(gè)迭代器。

auto b = v.begin(), e = v.end()

迭代器的操作

迭代器只支持下表列出來(lái)的操作,我們可以通過(guò)==或!=比較兩個(gè)有效的迭代器,如果迭代器代表著同一個(gè)元素或者都是最后一個(gè)元素的下一個(gè)位置則相等,否則它們不等。 |操作|解釋| |*iter|返回迭代器代表的指針指向的值| |iter->mem|等價(jià)于(*iter).mem| |++iter|指向容器中的下一個(gè)元素| |--iter|指向容器中的前一個(gè)元素| |iter1 == iter2|判斷兩個(gè)迭代器是否相等| |iter1 != iter2|判斷兩個(gè)迭代器是否不等|

對(duì)于指針,我們可以使用解引用符獲取一個(gè)迭代器的元素,和指針相同,我們只能通過(guò)解引用符獲取一個(gè)有效的迭代器的元素,如果解引用一個(gè)最后一個(gè)元素之后的迭代器結(jié)果是未知的。

# include
# include
using namespace std;


int main() {
  string s("some string");
  if (s.begin() != s.end()) {
    auto it = s.begin();
    *it = toupper(*it);
  }
  cout<

上述的例子就是通過(guò)迭代器獲取字符串s的首個(gè)字符并將其大寫(xiě)。

迭代器從一個(gè)元素移動(dòng)到另一個(gè)元素

迭代器私用自增操作符從一個(gè)元素移動(dòng)到該元素的下一個(gè)元素,自增一個(gè)迭代器與自增一個(gè)整型十分類(lèi)似,對(duì)于整型而言,自增的是其本身的值,對(duì)于迭代器而言,其影響是往前進(jìn)一個(gè)位置。

?由于end返回的不是一個(gè)元素,所以其不能自增或者解引用

?

使用自增操作我們可以重寫(xiě)之前的程序:

# include
# include
using namespace std;


int main() {
  string s("some string");
  for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {
    *it = toupper(*it);
  }
  cout<

如上例所示,我們通過(guò)迭代器可以實(shí)現(xiàn)循環(huán)遍歷。

迭代器的類(lèi)型

正如我們并不準(zhǔn)確知道vector的準(zhǔn)確類(lèi)型或者string的size,同樣的,我們也不知道同時(shí)也不需要知道迭代器的準(zhǔn)確類(lèi)型,但是根據(jù)迭代器的讀寫(xiě)權(quán)限定義了以下幾種迭代器的類(lèi)型:

vector<int>::iterator it; //it可以讀也可以寫(xiě)vector
  string::iterator it2; //it2可以讀寫(xiě)字符串里的字符
  vector<int>::const_iterator it3; //it3可以讀但是不可以寫(xiě)元素
  string::const_iterator it4; //it4可以讀但是不可以寫(xiě)字符串里面的字符

const_iterator表現(xiàn)就像是常量指針,可以讀取元素但是不能寫(xiě)元素

begin和end操作

begin和end返回的結(jié)果取決于它們操作的對(duì)象是不是常量,如果操作對(duì)象是常量,那么begin和end返回的就是const_iterator,如果對(duì)象不是常量,那么返回的就是iterator。

# include
# include
# include
using namespace std;


int main() {
vector<int> v;
const vector<int> cv;
auto it1 = v.begin(); //it返回的是vector
auto it2 = v.begin(); //it返回的是vector
}

這種默認(rèn)的返回策略有時(shí)候并不滿(mǎn)足需求,在一些情況下一些非常量的vector我們只想讀取元素,避免元素被更改,在C++11中提供了以下新的方法cbegin和cend,無(wú)論vetor是不是常量都返回const_iterator。

auto it3 = v.cbegin();

迭代器的數(shù)學(xué)運(yùn)算

處理之前提到自增和自減外,迭代器還支持以下數(shù)學(xué)運(yùn)算,雖然迭代器是沒(méi)有下標(biāo)的概念的,但是一下運(yùn)算都可以理解為是對(duì)于下標(biāo)的操作,如加減就是自增和自減的普通形式,就是向前移動(dòng)或者向后移動(dòng),大小比較就是前后位置的比較。

操作 解釋
iter + n 同一個(gè)容器向前移動(dòng)n
iter - n 同一個(gè)容器向后移動(dòng)
iter1 += n 將移動(dòng)結(jié)果賦值給iter1
iter1 -= n 將移動(dòng)結(jié)果賦值給iter1
>, >=, <, <= 相對(duì)位置的比較

這么說(shuō)起來(lái)可能又帶你抽象,下面用一個(gè)二分法來(lái)說(shuō)明:

# include
# include
# include
using namespace std;


int main() {
  vector<int> v = {1, 2, 3, 4, 5};
  auto beg = v.begin(), end = v.end();
  auto mid = v.begin() + (end - beg) / 2;
  int target = 2;
  while (mid != end && *mid != target)
  {
    if (target < *mid) {
      end = mid;
    } else{
      beg = mid;
    }
    mid = beg + (end - beg) / 2;
  }
  cout<<to_string(*mid)<

以上例子會(huì)打印2,也就是元素2的位置。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2131

    瀏覽量

    77417
  • Vector
    +關(guān)注

    關(guān)注

    3

    文章

    105

    瀏覽量

    10101
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    4638
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言和C++那些不同的地方

    ++11標(biāo)準(zhǔn)。根據(jù)不同的標(biāo)準(zhǔn),它們的功能也會(huì)有所不同,但是越新的版本支持的編譯越少,所以本文在討論的時(shí)候使用的C語(yǔ)言標(biāo)準(zhǔn)是C89,C++標(biāo)準(zhǔn)是C
    的頭像 發(fā)表于 12-07 14:29 ?2374次閱讀
    <b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

    js迭代異步介紹

    js 迭代 異步 介紹 (Introduction)It’s been a long while coming and I feel it’s high time I made a post
    發(fā)表于 09-06 09:26

    C++C/C++程序設(shè)計(jì)教程_C/C++概述

    C++基礎(chǔ)知識(shí),簡(jiǎn)要介紹C++的一些簡(jiǎn)單知識(shí),概念,函數(shù)
    發(fā)表于 12-25 10:15 ?0次下載

    C++入門(mén)教程之C++程序設(shè)計(jì)的課件資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++入門(mén)教程之C++程序設(shè)計(jì)的課件資料免費(fèi)下載主要內(nèi)容包括了:1. 認(rèn)識(shí)C++2. C++的現(xiàn)狀和發(fā)展3.
    發(fā)表于 12-07 08:00 ?33次下載
    <b class='flag-5'>C++</b>入門(mén)教程之<b class='flag-5'>C++</b>程序設(shè)計(jì)的課件資料免費(fèi)下載

    VISUAL C++教程之VISUAL C++的安裝和使用方法

    本文檔的主要內(nèi)容詳細(xì)介紹的是VISUAL C++教程之VISUAL C++的安裝和使用方法資料免費(fèi)下載。
    發(fā)表于 12-27 16:32 ?20次下載
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用方法

    Visual C++教程之C++的基礎(chǔ)知識(shí)介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是Visual C++教程之C++的基礎(chǔ)知識(shí)介紹主要內(nèi)容包括了:1 類(lèi)和對(duì)象,2 類(lèi)的成員及特性,3 繼承和派生類(lèi)
    發(fā)表于 02-15 15:59 ?9次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎(chǔ)知識(shí)<b class='flag-5'>介紹</b>

    C++程序設(shè)計(jì)的基礎(chǔ)知識(shí)初步了解C++的資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計(jì)的基礎(chǔ)知識(shí)初步了解C++的資料免費(fèi)下載包括了:1 認(rèn)識(shí)C++,2 C++的現(xiàn)狀和發(fā)展,3
    發(fā)表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)的基礎(chǔ)知識(shí)初步了解<b class='flag-5'>C++</b>的資料免費(fèi)下載

    EE-128:C++的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)

    EE-128:C++的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b><b class='flag-5'>中</b>的DSP:從<b class='flag-5'>C++</b>調(diào)用匯編類(lèi)成員函數(shù)

    IAR中使用C++做開(kāi)發(fā)語(yǔ)言,更加簡(jiǎn)單高效

    本文簡(jiǎn)要介紹了如何在IAR配置C++開(kāi)發(fā)環(huán)境,由于C++的封裝支持,引入面向?qū)ο蟮拈_(kāi)發(fā)思路可以使得用C++進(jìn)行單片機(jī)獲得更高的開(kāi)發(fā)效率
    發(fā)表于 12-03 11:36 ?4次下載
    IAR中使用<b class='flag-5'>C++</b>做開(kāi)發(fā)語(yǔ)言,更加<b class='flag-5'>簡(jiǎn)單</b>高效

    C++的引用和指針

    之前的文章我們已經(jīng)介紹C++的基本類(lèi)型如int,bool和double等,除了基本類(lèi)型C++還有一些更復(fù)雜的數(shù)據(jù)類(lèi)型復(fù)合類(lèi)型,所謂的復(fù)合類(lèi)型就是通過(guò)其他類(lèi)型定義的類(lèi)型,本篇文章我們
    的頭像 發(fā)表于 03-17 14:00 ?1407次閱讀

    C++的const關(guān)鍵字介紹

    前一篇文章我們主要介紹C++的復(fù)合類(lèi)型引用和指針,這篇文章我們將會(huì)主要介紹C++const
    的頭像 發(fā)表于 03-17 14:01 ?1424次閱讀

    C++的輸入流和輸出流介紹

    C++的輸入流和輸出流是C++標(biāo)準(zhǔn)庫(kù)的兩個(gè)重要的流類(lèi),分別用于輸入和輸出數(shù)據(jù)。在本篇博客,我們將詳細(xì)介紹
    的頭像 發(fā)表于 04-30 17:58 ?2972次閱讀

    C++入門(mén)之通用算法

    C++ 是一種強(qiáng)大的編程語(yǔ)言,它提供了許多通用算法,可以用于各種容器類(lèi)型。這些算法是通過(guò)迭代來(lái)操作容器的元素,因此它們是通用的,可以用于不同類(lèi)型的容器。在本篇博客
    的頭像 發(fā)表于 05-17 09:40 ?1544次閱讀

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫(xiě)
    的頭像 發(fā)表于 01-11 09:00 ?1883次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    C++實(shí)現(xiàn)類(lèi)似instanceof的方法

    函數(shù),可實(shí)際上C++沒(méi)有。但是別著急,其實(shí)C++中有兩種簡(jiǎn)單的方法可以實(shí)現(xiàn)類(lèi)似Java的instanceof的功能。 在
    的頭像 發(fā)表于 07-18 10:16 ?1622次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實(shí)現(xiàn)類(lèi)似instanceof的方法
    滕州市| 宁晋县| 共和县| 六盘水市| 大新县| 东源县| 桐乡市| 江西省| 河曲县| 高清| 普定县| 南安市| 崇信县| 江源县| 花垣县| 大连市| 新邵县| 临夏县| 扎鲁特旗| 汤原县| 弥勒县| 柞水县| 德清县| 安义县| 福鼎市| 招远市| 寻乌县| 周宁县| 郎溪县| 海安县| 偏关县| 吴忠市| 贞丰县| 唐河县| 庄河市| 措美县| 茂名市| 海门市| 筠连县| 时尚| 宝清县|