C++的几种遍历形式
引言
看到了STL中的for_each遍歷算法,看完后第一感覺就是for_each能做的用for循環(huán)也照樣可以啊,于是歸類了幾種遍歷形式,在這里總結(jié)一下;
在這里說一下為什么C++中有這么多種的遍歷形式,主要因?yàn)镃++是多范式語言,通俗來說就是有什么就加什么,只要你能用的舒服就行;
下面羅列四種遍歷方式;
以vector類為例:
先定義一個(gè)vecctor和寫一個(gè)輸出函數(shù),為了統(tǒng)一,這里先來一個(gè)模板:
下面就是在遍歷循環(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ù):
然后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)不同,如果需要對下標(biāo)進(jìn)行操作,那么這個(gè)形式就不怎么方便了;
總結(jié)
這四種遍歷對我來說用的最多的還是第二種和第四種,現(xiàn)在接觸編程時(shí)間還是比較短,認(rèn)識(shí)可能也有不足,這里羅列了四種遍歷方式,希望都可以學(xué)習(xí)一下,當(dāng)然還有while循環(huán),這里沒有什么可比性;
如果有錯(cuò)誤請指正,謝謝
總結(jié)
以上是生活随笔為你收集整理的C++的几种遍历形式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内建函数对象(STL)
- 下一篇: C++中的 c_str() 函数