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