for(it = str.begin(); it != str.end() && isspace(*it); it++) ;
str.erase(str.begin(), it);
這個循環究竟在做什麼?for循環中的字符串函數
for(it = str.begin(); it != str.end() && isspace(*it); it++) ;
str.erase(str.begin(), it);
這個循環究竟在做什麼?for循環中的字符串函數
for(it = str.begin(); it != str.end() && isspace(*it); it++) ;
這條線在一個字符串(str.begin()
)的開始位置的迭代器。條件it != str.end() && isspace(*it)
用純英語表示「,而字符串的末尾還沒有到達,當前字符是空格,遞增迭代器。」
下一頁
str.erase(str.begin(), it);
這會刪除其字符串的一部分開始迭代。清楚地說,它修整了字符串開始處的任何空格。
編輯:請閱讀下面的評論,它將有用的信息添加到答案。
除了'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
這段代碼對自己來說太聰明瞭 - 有很好的理由不會過多地垂直壓縮代碼。
環路混亂是其中之一。
重寫比特
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
形成自己。)
我特別喜歡你如何注意到循環的怪異,並建議如何使它非常清晰*內部沒有任何內容。 – 2014-10-16 13:54:42
該代碼DES兩件事情。
第一個發現的字符串中的第一個字符,這是不是一個空白:
for(it = str.begin(); it != str.end() && isspace(*it); it++) ;
第二刪除所有字符,直到該字符:
str.erase(str.begin(), it);
的組合他們:代碼刪除字符串開頭的空白字符:)
字符串函數(sic)不是循環的一部分。所有的工作都是在循環的條件和增量部分完成的。循環完成後,'erase'被調用一次。 – jrok 2014-10-16 12:17:53
給定'begin()'和'end()',這是* not * C#那麼它爲什麼被標記爲這樣? – crashmstr 2014-10-16 12:17:59
它是* C++ *,而不是* C#* – 2014-10-16 12:18:08