如何正确检查istreambuf_iterator是否已到达流末尾

时间:2015-10-07 14:22:39

标签: c++

在标准中我读到你必须创建一个deafult迭代器,以便能够知道迭代器是否已到达流的末尾。我认为它变得非常丑陋,是不是有任何预定义的符号或等同物可以帮助我们在这里?

  

默认构造的std :: istreambuf_iterator称为流末端迭代器。当有效的std :: istreambuf_iterator到达底层流的末尾时,它变得等于流末尾迭代器。

以下是代码示例:

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

    if (it != end) { break;}

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

1 个答案:

答案 0 :(得分:3)

  

是否有任何可以帮助我们的预定义符号或等效符号?

  

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

这是!

  

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

作为哨兵的单一迭代器实际上非常优雅。它没有向库中引入任何新名称,它允许我们使用startend迭代器编写通用代码,而这些迭代器并不关心你要迭代的是什么类型的东西。这对标准算法非常重要。

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());
}

想象一下,对于您拥有startend的容器,但对于您拥有start的流并且呼叫start.hasNext()?现在,这不是很优雅。 那是凌乱!