C++的新風(fēng)格
如果是10年前,C++語言也好,程序員也好,應(yīng)該是相當(dāng)自信的。但是近年來,各種新語言,新架構(gòu)不斷涌現(xiàn),C++的地位雖然談不上動搖,但是許多場合被人搶了風(fēng)頭也是事實。因此C++的代碼風(fēng)格也在發(fā)生改變。今天的范圍for語句就算是一個例子。
功能介紹
循環(huán)最常見的的場景就是對數(shù)據(jù)集合的每一個元素進(jìn)行某種操作。C++11之前,大致是這樣的程序:
?
int a[] = {1, 2, 3, 4};
int sum = 0;
for(int i = 0 ; i < sizeof(a)/sizeof(a[0]); ++i){
????????sum += a[i];
}
或者是這樣
vector
int sum = 0;
for(auto it = v.begin(); it != v.end(); it++){
????sum += *it;
}
可以看出,雖然目的只是對數(shù)據(jù)集合中的每個元素進(jìn)行求和,還是要做如下幾件事:
定義和初始化循環(huán)變量
判斷循環(huán)條件
調(diào)整循環(huán)變量
C++程序員已經(jīng)熟悉了這些過程,但還是麻煩了一些。大概是因為這個原因,C++11引入了范圍for語句:
int?array[]{1,?2,?3,?4};
int?sum?=?0;
?for(int a : array){
?????sum?+=?a;
}
vector
int?sum?=?0;
for(int?v:?vect){
????sum?+=?v;
}
for(int v : vect)讀作“對于vect中的每一個v”。應(yīng)該說,程序簡練了不少。
運(yùn)用條件
是不是所有地數(shù)據(jù)集合可以交給范圍for遍歷呢?答案是否定的。
數(shù)據(jù)v被范圍for遍歷的條件是,該數(shù)據(jù)支持v.begin()/v.end()或者是begin(v)/end(v)并返回一個迭代器。STL中的容器都滿足上述條件。對于內(nèi)置類型的數(shù)組來講C++編譯器提供了等同于上述接口的機(jī)制,因此也可以在范圍for中使用。
作者觀點(diǎn)
C++變得越來越不像C++了,不知道是好事還是壞事。