在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單介紹C++中迭代器

jf_78858299 ? 來源:QStack ? 作者: 月下西樓 ? 2023-03-17 14:03 ? 次閱讀

前言

之前的兩篇文章我們主要了解了vector和string的相關知識,從中我們知道可以通過下標來訪問vector的元素或者string的字符,但是除了這種方式還有一種更為通用的方式獲取元素,那就是迭代器,這篇文章就會簡單介紹迭代器的相關內容。

迭代器簡介

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

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

迭代器的使用

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

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

迭代器的操作

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

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

# include
# include
using namespace std;


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

上述的例子就是通過迭代器獲取字符串s的首個字符并將其大寫。

迭代器從一個元素移動到另一個元素

迭代器私用自增操作符從一個元素移動到該元素的下一個元素,自增一個迭代器與自增一個整型十分類似,對于整型而言,自增的是其本身的值,對于迭代器而言,其影響是往前進一個位置。

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

?

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

# 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<

如上例所示,我們通過迭代器可以實現循環遍歷。

迭代器的類型

正如我們并不準確知道vector的準確類型或者string的size,同樣的,我們也不知道同時也不需要知道迭代器的準確類型,但是根據迭代器的讀寫權限定義了以下幾種迭代器的類型:

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

const_iterator表現就像是常量指針,可以讀取元素但是不能寫元素

begin和end操作

begin和end返回的結果取決于它們操作的對象是不是常量,如果操作對象是常量,那么begin和end返回的就是const_iterator,如果對象不是常量,那么返回的就是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
}

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

auto it3 = v.cbegin();

迭代器的數學運算

處理之前提到自增和自減外,迭代器還支持以下數學運算,雖然迭代器是沒有下標的概念的,但是一下運算都可以理解為是對于下標的操作,如加減就是自增和自減的普通形式,就是向前移動或者向后移動,大小比較就是前后位置的比較。

操作 解釋
iter + n 同一個容器向前移動n
iter - n 同一個容器向后移動
iter1 += n 將移動結果賦值給iter1
iter1 -= n 將移動結果賦值給iter1
>, >=, <, <= 相對位置的比較

這么說起來可能又帶你抽象,下面用一個二分法來說明:

# 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)<

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    22

    文章

    2117

    瀏覽量

    74781
  • Vector
    +關注

    關注

    3

    文章

    69

    瀏覽量

    9058
  • 迭代器
    +關注

    關注

    0

    文章

    45

    瀏覽量

    4441
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    C語言和C++那些不同的地方

    ++11標準。根據不同的標準,它們的功能也會有所不同,但是越新的版本支持的編譯越少,所以本文在討論的時候使用的C語言標準是C89,C++標準是C
    的頭像 發表于 12-07 14:29 ?1439次閱讀
    <b class='flag-5'>C</b>語言和<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
    發表于 09-06 09:26

    CodeWarrior C and C++ and Assembly 語言參考設計

    本文是英文版的,介紹了CodeWarrior C and C++ and Assembly 語言參考設計,在您的設計或許有用:
    發表于 06-22 15:33 ?74次下載

    C++C/C++程序設計教程_C/C++概述

    C++基礎知識,簡要介紹C++的一些簡單知識,概念,函數
    發表于 12-25 10:15 ?0次下載

    C++入門教程之C++程序設計的課件資料免費下載

    本文檔的主要內容詳細介紹的是C++入門教程之C++程序設計的課件資料免費下載主要內容包括了:1. 認識C++2. C++的現狀和發展3.
    發表于 12-07 08:00 ?33次下載
    <b class='flag-5'>C++</b>入門教程之<b class='flag-5'>C++</b>程序設計的課件資料免費下載

    Visual C++教程之C++的基礎知識介紹

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

    C++程序設計的基礎知識初步了解C++的資料免費下載

    本文檔的主要內容詳細介紹的是C++程序設計的基礎知識初步了解C++的資料免費下載包括了:1 認識C++,2 C++的現狀和發展,3
    發表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設計的基礎知識初步了解<b class='flag-5'>C++</b>的資料免費下載

    EE-128:C++的DSP:從C++調用匯編類成員函數

    EE-128:C++的DSP:從C++調用匯編類成員函數
    發表于 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>調用匯編類成員函數

    IAR中使用C++做開發語言,更加簡單高效

    本文簡要介紹了如何在IAR配置C++開發環境,由于C++的封裝支持,引入面向對象的開發思路可以使得用C++進行單片機獲得更高的開發效率
    發表于 12-03 11:36 ?4次下載
    IAR中使用<b class='flag-5'>C++</b>做開發語言,更加<b class='flag-5'>簡單</b>高效

    C++的引用和指針

    之前的文章我們已經介紹C++的基本類型如int,bool和double等,除了基本類型C++還有一些更復雜的數據類型復合類型,所謂的復合類型就是通過其他類型定義的類型,本篇文章我們
    的頭像 發表于 03-17 14:00 ?827次閱讀

    C++的const關鍵字介紹

    前一篇文章我們主要介紹C++的復合類型引用和指針,這篇文章我們將會主要介紹C++const
    的頭像 發表于 03-17 14:01 ?890次閱讀

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

    C++的輸入流和輸出流是C++標準庫的兩個重要的流類,分別用于輸入和輸出數據。在本篇博客,我們將詳細介紹
    的頭像 發表于 04-30 17:58 ?2417次閱讀

    C++入門之通用算法

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

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?919次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    C++實現類似instanceof的方法

    函數,可實際上C++沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java的instanceof的功能。 在
    的頭像 發表于 07-18 10:16 ?861次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現類似instanceof的方法
    主站蜘蛛池模板: 国产精品五月天 | 国产小视频在线免费观看 | 亚洲一区二区三区网站 | 日本天堂影院在线播放 | 成人国产精品一级毛片视频 | 2021久久精品国产99国产精品 | 人人揉揉香蕉大免费不卡 | 亚洲天天综合网 | 午夜精品久久久久久毛片 | 六月丁香婷婷综合 | 男人搡女人视频免费看 | 婷婷色网站 | 午夜小视频在线观看 | 天天精品视频 | 午夜精品久久久久久久第一页 | 女人被两根一起进3p在线观看 | 海棠高h粗暴调教双性男男 韩国韩宝贝2020vip福利视频 | 国产在线播放一区 | 亚洲第一网站 | 亚洲免费视频一区二区三区 | 五月婷婷色 | 欧美久操 | 美女免费视频黄 | 成人v片| 亚洲一区三区 | tube69xxxxhd日本 | 天天操天天舔天天干 | 22eee在线播放成人免费视频 | 成人一级网站 | 久久精品国产99久久72 | xxx久久| 丁香六月婷婷精品免费观看 | 欧美午夜网 | 午夜爱爱毛片xxxx视频免费看 | 久久男人视频 | 欧美一级黄色片视频 | 欧美视频免费一区二区三区 | 奇米影视亚洲四色8888 | 日本三级黄色网址 | 国产99在线播放 | 美女黄色毛片免费看 |