C++通過叠代修改字符串本身(auto類型說明符)
阿新 • • 發佈:2018-11-30
推斷 限定 發現 不用 維數 row love you 比較 ring 本身,則要限定參與遍歷的是引用:
以字符串這種支持
for (declaration : expression)
statement
這樣for
語句叠代的數據結構為例,我們看看auto
關鍵字在類型推斷中的作用。
string s = "I LOVE YOU!";
for (char ch : s){
cout << ch << endl;
}
輸出:
I LOVE YOU!
這種情況下用不用auto
都無所謂,因為這時候auto
並不能減少代碼量,但是一到復雜的循環時就可以體現出來了,因此最好還是用auto
。
像上面那樣對string進行遍歷並不能改變其本身,ch
是s
中每個字符的副本拷貝。想要改變s
for (auto &ch : s) {
ch = tolower(ch);
cout << ch << endl;
}
輸出:
i love you!
這樣ch
是s
中每個字符的引用,對ch
進行修改也就可以修改s
本身了。
for-each
這樣的語法應用於多維數組時,需要註意的是外層循環要使用引用:
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; for (auto &row : array){ for (auto col : row) cout << col << " "; cout << endl; }
如果row
不是引用,那麽它會被自動轉化為對這個二維數組每一行的指針,成為了指針,內層循環對指針進行遍歷就當然不合法了。
下面就auto
比較特殊的一點來舉個栗子:
int foo = 11; const int &a = 10; int *p = &foo; auto x = foo;//x是int auto y = a;//y是int,int類型的變量y當然可以用引用a來初始化,這裏a的頂層const屬性被移除。 auto &yy = a;//yy是const int &,所以可以用a來對yy進行初始化。 auto pp = p;//這個與下面一樣,我暫時還不能搞懂 auto *ppp = p;//ppp是int *,可以用p賦值初始化 cout << y << endl; cout << yy << endl; cout << pp << endl; cout << ppp << endl;
結果:
10
10
0x61fefc
0x61fefc
發現沒有,pp
與ppp
是一樣的,這裏涉及到auto
的一些原理,我不是太清楚。而且auto
定義的是引用時,初始化值頂層的const
屬性並不會移除,yy
是個例子;auto
定義的不是引用時,初始化值頂層的const
屬性會被移除,y
就是個例子。
我在v2ex發了個帖子是關於這個的,想看看的可以移步v2ex。
C++通過叠代修改字符串本身(auto類型說明符)