字符串迭代器和理解函数

时间:2014-01-03 18:42:00

标签: c++ string iterator

bool e_broj(const string &s){
    string::const_iterator it = s.begin();
    while(it != s.end() && isdigit(*it)){
        ++it;
    }
    return !s.empty() && it == s.end();
}

我有这个功能来检查字符串是否是数字。我在网上发现了这个片段,我想了解它是如何工作的。

// this declares it as the beginning of the string (iterator)
string::const_iterator it = s.begin(); 

// this checks until the end of the string and
// checks if each character of the iterator is a digit?
while(it != s.end() && isdigit(*it)){ 

// this line increases the iterator for next
// character after checking the previous character?
++it;

// this line returns true (is number) if the iterator
// came to the end of the string and the string is empty?
return !s.empty() && it == s.end();

2 个答案:

答案 0 :(得分:3)

您的理解几乎正确。唯一的错误是在最后:

// this line returns true (is number) if the iterator
//  came to the end of the string and the string is empty?
return !s.empty() && it == s.end();

这应该说“并且字符串为空”,因为表达式为!s.empty(),而不仅仅是s.empty()

你可能只是措辞有趣,但要清楚,while循环上的条件将使迭代器在字符串中移动,而不是在结尾处,而字符仍然是数字。

关于迭代器的术语让我觉得你并不完全理解它在做什么。您可以将迭代器视为指针(实际上,指针迭代器,但反之亦然)。第一行为您提供了一个“指向”字符串中第一个字符的迭代器。执行it++会将迭代器移动到下一个字符。 s.end()给出一个迭代器,它指出一个超过字符串结尾的部分(这是一个有效的迭代器)。 *it为您提供迭代器“指向”的字符。

答案 1 :(得分:2)

当一个非数字出现时,while循环停止在字符串OR处。

因此,如果我们没有一直前进到最后(it != s.end()),那么该字符串具有非数字,因此不是数字。

空字符串是一种特殊情况:它没有非数字,但它也不是数字。