Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确检查istreambuf_迭代器是否已到达流的末尾_C++ - Fatal编程技术网

C++ 如何正确检查istreambuf_迭代器是否已到达流的末尾

C++ 如何正确检查istreambuf_迭代器是否已到达流的末尾,c++,C++,在标准中,我读到您必须创建一个deafult迭代器才能知道迭代器是否已到达流的末尾。我觉得它越来越难看了,难道没有任何预定义的符号或等效物可以帮助我们吗 默认构造的std::istreambuf_迭代器称为流结束迭代器。当有效的std::istreambuf_迭代器到达基础流的末尾时,它将等于流的末尾迭代器 下面是代码示例: std::istreambuf_iterator<char> it(is); std::istreambuf_iterator<char> end;

在标准中,我读到您必须创建一个deafult迭代器才能知道迭代器是否已到达流的末尾。我觉得它越来越难看了,难道没有任何预定义的符号或等效物可以帮助我们吗

默认构造的std::istreambuf_迭代器称为流结束迭代器。当有效的std::istreambuf_迭代器到达基础流的末尾时,它将等于流的末尾迭代器

下面是代码示例:

std::istreambuf_iterator<char> it(is);
std::istreambuf_iterator<char> end;

    if (it != end) { break;}
std::istreambuf_迭代器it(is);
std::istreambuf_迭代器端;
如果(it!=end){break;}
为什么迭代器没有一个名为hasNext()或isEndOfStream()的函数

这里没有任何预定义的符号或等效符号可以帮助我们吗

您必须创建一个deafult迭代器才能知道迭代器是否已到达流的末尾

给你

为什么迭代器没有一个名为hasNext()或isEndOfStream()的函数

作为sentinel的单一迭代器实际上相当优雅。它不会向库中引入任何新名称,它允许我们使用
start
end
迭代器编写通用代码,这些迭代器不关心您迭代的是什么。这对于标准算法来说非常重要

void bar(const char c);

template <typename Iterator>
void foo(Iterator start, Iterator end)
{
   for (Iterator it = start; it != end; ++it)
      bar(*it);
}

void version_1()
{
   std::istreambuf_iterator<char> start(std::cin);
   std::istreambuf_iterator<char> end;
   foo(start, end);
}

void version_2()
{
   std::vector<char> v{0,1,2,3,4,5};
   foo(v.begin(), v.end());
}
void条(常量字符c);
模板
void foo(迭代器开始、迭代器结束)
{
for(迭代器it=start;it!=end;++it)
bar(*it);
}
无效版本_1()
{
std::istreambuf_迭代器启动(std::cin);
std::istreambuf_迭代器端;
foo(开始、结束);
}
无效版本_2()
{
std::向量v{0,1,2,3,4,5};
foo(v.begin(),v.end());
}

想象一下,对于容器,您有
start
end
,但是对于流,您有
start
和调用
start.hasNext()
?现在,这不是很优雅。太乱了

我想你自己回答了标题中的问题。至于第二个问题,它是关于在所有迭代器之间呈现一个统一的接口。并不是所有的迭代器都知道自己什么时候到达终点。在版本2中,我看到了好处,解决方案很吸引人。也许我只是吹毛求疵,但在版本_1中,您声明了标准中描述的end变量,我不喜欢这样做。在大多数情况下,您希望迭代整个集合,那么如果end始终是end,那么为什么必须添加“end”呢。(希望这是有意义的)@JohanEngblom:我解决了这个问题。这样您就可以编写通用代码了。当然,构建
end
也没什么大不了的吧?将“所有情况”更改为“大多数情况”是值得的,这样您可以做更多的事情。C++标准库是关于灵活性,而不是规定主义。