2014-10-16 134 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); 

的组合他们:代码删除字符串开头的空白字符:)