【发布时间】:2011-09-20 21:54:24
【问题描述】:
据我所知,迭代器类别的层次结构如下:
Random access -> Bi-directional -> Forward -> Input
-> Output
正确吗?
我一直认为有一个规则,如果一个算法需要一种特定类型的迭代器,你可以在链上提供类别的迭代器,但不能向下。所以我正在阅读this answer,其中 ildjarn suggests 建议(后来更正自己)使用std::ifstream 和std::istream_iterator 和std::search 在文件中查找数据。我正要评论说你不能这样做,因为search 需要转发迭代器,而istream_iterator 是一个输入迭代器。但为了确保,我尝试了这个:
std::istringstream iss("Elephant hats for sale.");
std::istream_iterator<char> begin(iss), end;
std::string sub("hat");
auto i = std::search(begin, end, sub.begin(), sub.end());
我没想到它会编译,但它确实编译了。但是,结果似乎没有用,因为如果我按照它来:
while(i != end)
{
std::cout << *i;
++i;
}
没有输出。所以,我的问题是:我的编译器是否错误地允许我使用istream_iterator 调用search?还是没有规则阻止这种事情发生?
【问题讨论】:
-
自从我明显的错误 ;-] 我更新了我的答案,其中包含输入迭代器的包装器(来自 Boost.Spirit)的链接,使它们适合用作前向迭代器。