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

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

推斷 限定 發現 不用 維數 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進行遍歷並不能改變其本身,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。

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