1. 程式人生 > >C++通過迭代修改字串本身(auto型別說明符)

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就是個例子。
我在v2ex發了個帖子是關於這個的,想看看的可以移步v2ex