Насколько мне известно, иерархия категорий итераторов выглядит следующим образом:
Random access -> Bi-directional -> Forward -> Input
-> Output
Правильно?
Я всегда думал, что существует правило: если алгоритм ожидает определенный тип итератора, вы можете предоставить итераторы категорий по цепочке, но не вниз. Итак, я читал этот ответ, где ildjarn предлагает предлагаемый (а затем исправленный), используя std::ifstream
с std::istream_iterator
и std::search
для поиска данных в файле a. Я собирался прокомментировать, что вы не можете этого сделать, потому что search
ожидает Forward iterators, а 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;
}
Нет вывода. Итак, мой вопрос заключается в следующем: мой компилятор ошибочен, разрешив мой вызов search
с помощью istream_iterator
? Или нет правил, запрещающих подобные вещи?