C++通過迭代修改字符串本身(auto類型說明符)

以字符串這種支持

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進行遍歷並不能改變其本身,chs中每個字符的副本拷貝。想要改變s本身,則要限定參與遍歷的是引用:

for (auto &ch : s) {
    ch = tolower(ch);
    cout << ch << endl;
}

輸出:

i love you!

這樣chs中每個字符的引用,對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

發現沒有,ppppp是一樣的,這裏涉及到auto的一些原理,我不是太清楚。而且auto定義的是引用時,初始化值頂層的const屬性並不會移除,yy是個例子;auto定義的不是引用時,初始化值頂層的const屬性會被移除,y就是個例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章