【发布时间】:2019-08-23 12:11:03
【问题描述】:
我正在通过 Andrew Koenig 和 Barbara E. Moo 的 Accelerated C++ 学习 C++。我正在尝试了解输入运算符的工作原理以及它们与 STL 算法的关系。
这是让我感到困惑的一段代码:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <cctype>
bool space(char c)
{
return std::isspace(c);
}
int main()
{
std::istream_iterator<char> i = std::find_if(
std::istream_iterator<char>(std::cin),
std::istream_iterator<char>(),
space);
std::cout << *i << std::endl;
return 0;
}
代码编译得很好,但是当我在任何输入上运行它时,它输出的是输入的最后一个字符。例如,我预计123 456 的输出为 ,但实际上是6。同样,我预计123456 的输出会出现一些错误,因为我们尝试访问一个尚不存在的元素输出又是。我错过了什么?
【问题讨论】:
-
std::istream_iterator是一个输入迭代器。根据 cppreference.com 的说法,由于某些不清楚的原因,只有采用执行策略参数的重载被指定为需要前向迭代器。如果没有执行策略参数,find_if只需要输入迭代器。在我看来,这个问题中的例子证明这是一个明显的缺陷。std::find_if应该需要前向迭代器,而不是输入迭代器。 -
@SamVarshavchik -- 我不知道你是否正确
std::find_if应该总是至少需要一个前向迭代器,但执行策略版本需要前向迭代器的原因是 所有 采用执行策略的算法都需要前向迭代器或更好的迭代器。将并行算法应用于输入迭代器指定的序列是行不通的;该算法将不得不依靠串行版本。
标签: c++ stl iterator input-iterator