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