据我所知,迭代器类别的层次结构如下:
Random access -> Bi-directional -> Forward -> Input
-> Output
Run Code Online (Sandbox Code Playgroud)
正确?
我一直认为有一个规则,如果算法需要特定类型的迭代器,你可以在链上提供类别的迭代器,但不能向下.所以我正在阅读这个答案,其中ildjarn 建议使用std::ifstream
with 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());
Run Code Online (Sandbox Code Playgroud)
我没想到它会编译,但确实如此.但是,结果似乎没用,因为如果我遵循它:
while(i != end)
{
std::cout << *i;
++i;
}
Run Code Online (Sandbox Code Playgroud)
没有输出.所以,我的问题是:我的编译器错误地允许我的调用search
使用istream_iterator
?或者没有规则阻止这种事情?