2014-10-16 176 views
-4
for(it = str.begin(); it != str.end() && isspace(*it); it++) ; 
str.erase(str.begin(), it); 

這個循環究竟在做什麼?for循環中的字符串函數

+1

字符串函數(sic)不是循環的一部分。所有的工作都是在循環的條件和增量部分完成的。循環完成後,'erase'被調用一次。 – jrok 2014-10-16 12:17:53

+0

給定'begin()'和'end()',這是* not * C#那麼它爲什麼被標記爲這樣? – crashmstr 2014-10-16 12:17:59

+0

它是* C++ *,而不是* C#* – 2014-10-16 12:18:08

回答

6
for(it = str.begin(); it != str.end() && isspace(*it); it++) ; 

這條線在一個字符串(str.begin())的開始位置的迭代器。條件it != str.end() && isspace(*it)用純英語表示「,而字符串的末尾還沒有到達,當前字符是空格,遞增迭代器。」

下一頁

str.erase(str.begin(), it); 

這會刪除其字符串的一部分開始迭代。清楚地說,它修整了字符串開始處的任何空格。

編輯:請閱讀下面的評論,它將有用的信息添加到答案。

+1

除了'isspace(* it)'是未定義的行爲。 (跳過前導空格的「正確」方法是'it = std :: find_if(str.begin(),str.end(),[](unsigned char ch){!isspace(ch);});'' (我必須感謝Alf宣佈lambda採用'unsigned char'的技巧,從而避免了必要的演員陣容。) – 2014-10-16 13:11:59

4

這段代碼對自己來說太聰明瞭 - 有很好的理由不會過多地垂直壓縮代碼。
環路混亂是其中之一。

重寫比特

for(it = str.begin(); it != str.end() && isspace(*it); it++) 
    ; 
str.erase(str.begin(), it); 

,或等價

for(it = str.begin(); it != str.end() && isspace(*it); it++) 
{ 
    // Personally, I always put an "intentionally left empty" comment inside these. 
} 
str.erase(str.begin(), it); 

清楚地表明,該erase循環。

重寫使用while

it = str.begin(); 
while (it != str.end() && isspace(*it)) 
{ 
    it++; 
} 
str.erase(str.begin(), it); 

使它更加明顯,它首先查找字符串中的第一個非空格字符,然後才刪除所有內容,即TRIMS前導空格的循環。

(我更喜歡while形成自己。)

+0

我特別喜歡你如何注意到循環的怪異,並建議如何使它非常清晰*內部沒有任何內容。 – 2014-10-16 13:54:42

0

該代碼DES兩件事情。

第一個發現的字符串中的第一個字符,這是不是一個空白:

for(it = str.begin(); it != str.end() && isspace(*it); it++) ; 

第二刪除所有字符,直到該字符:

str.erase(str.begin(), it); 

的組合他們:代碼刪除字符串開頭的空白字符:)