日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++的几种遍历形式

發(fā)布時(shí)間:2025/3/21 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++的几种遍历形式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

看到了STL中的for_each遍歷算法,看完后第一感覺就是for_each能做的用for循環(huán)也照樣可以啊,于是歸類了幾種遍歷形式,在這里總結(jié)一下;

在這里說一下為什么C++中有這么多種的遍歷形式,主要因?yàn)镃++是多范式語言,通俗來說就是有什么就加什么,只要你能用的舒服就行;

下面羅列四種遍歷方式;
以vector類為例:
先定義一個(gè)vecctor和寫一個(gè)輸出函數(shù),為了統(tǒng)一,這里先來一個(gè)模板:

#include<iostream> #include<vector> #include<algorithm> using namespace std;//輸出函數(shù) void myPrint(int n) {cout << n << ' '; } int main() {vector<int> vec(10, 5);?????遍歷循環(huán)cout << endl;return 0; }

下面就是在遍歷循環(huán)部分可以寫的四種形式;

一,迭代器遍歷

for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {myPrint(*it);}

這個(gè)是通過迭代器進(jìn)行的遍歷,有以下幾個(gè)特點(diǎn):
1 太復(fù)雜
2 這里只列了不等于操作,還有小于大于等判斷條件,有的容器不支持這些操作
3 判斷條件有時(shí)候會(huì)寫錯(cuò),因?yàn)?.end()沒有確切的元素指向,新手很容易出錯(cuò)

二,下標(biāo)遍歷

for (int i = 0; i < vec.size(); ++i) {myPrint(vec[i]);}

這個(gè)是我們常見的遍歷形式,也有以下幾個(gè)特點(diǎn):
1 調(diào)用 vec.size()會(huì)有效率的問題,這個(gè)很多剛接觸c++的都不知道,其實(shí)編譯器是有優(yōu)化的,但是優(yōu)化多少并不清楚,性能還是有損耗的
2 并不是所有的容器都支持下標(biāo)操作,比如list

三,算法for_each遍歷

for_each(vec.begin(), vec.end(), myPrint);

這個(gè)就是用了STL提供的遍歷算法,需要頭文件#include<algorithm>
第三個(gè)參數(shù)可以是一個(gè)函數(shù)也可以是一個(gè)仿函數(shù),這個(gè)函數(shù)需要自己寫好,這也是for_each的必要步驟之一;
如果是仿函數(shù)又是什么樣子?
先寫一個(gè)仿函數(shù):

class myPrint02 { public:bool operator() (int n) {cout << n << ' ';} };

然后for_each第三個(gè)參數(shù)調(diào)用就是

for_each(vec.begin(), vec.end(), myPrint02());

可以看出來區(qū)別就是仿函數(shù)多了一個(gè)括號(hào),記住這點(diǎn)就行;

for_each的特點(diǎn)是:
1 相比前兩種不容易出錯(cuò)
2 相比前兩種書寫簡單
3 但是在第三個(gè)參數(shù)寫調(diào)用函數(shù)還是有點(diǎn)麻煩;
4 只能實(shí)現(xiàn)遍歷,不能在遍歷的過程中執(zhí)行其他操作

這里補(bǔ)充一點(diǎn),就是如果像在遍歷中進(jìn)行操作,還得用 for_each ,那該怎么辦?
STL同樣提供了一個(gè)遍歷函數(shù) transform ,這個(gè)就是實(shí)現(xiàn)一個(gè)遍歷操作的,但是同樣有些局限,感興趣的可以了解一下;

四,基于范圍的for循環(huán)

for (int i : vec) {myPrint(i);}

這個(gè)看著是不是比較舒服,這是C++11才有的,是基于范圍(range-based)的for循環(huán),專門為了STL設(shè)計(jì),
其實(shí)這個(gè)和 for_each 可以說幾乎一樣,但是基于范圍的for循環(huán)可以在遍歷中修改容器的內(nèi)容,只需要一個(gè)引用就可以了;
特點(diǎn)是:
1 不容易出錯(cuò)
2 書寫更簡單

畢竟是比較新的遍歷形式,所在遍歷容器的時(shí)候能用該形式就用該形式,但是這個(gè)和第二種遍歷也有一點(diǎn)不同,如果需要對(duì)下標(biāo)進(jìn)行操作,那么這個(gè)形式就不怎么方便了;

總結(jié)

這四種遍歷對(duì)我來說用的最多的還是第二種和第四種,現(xiàn)在接觸編程時(shí)間還是比較短,認(rèn)識(shí)可能也有不足,這里羅列了四種遍歷方式,希望都可以學(xué)習(xí)一下,當(dāng)然還有while循環(huán),這里沒有什么可比性;

如果有錯(cuò)誤請(qǐng)指正,謝謝

總結(jié)

以上是生活随笔為你收集整理的C++的几种遍历形式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。