Можно ли использовать итераторы ввода там, где ожидаются прямые итераторы?

Насколько мне известно, иерархия категорий итераторов выглядит следующим образом:

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 ? Или нет правил, предотвращающих подобные вещи?

13
задан Community 23 May 2017 в 12:25
поделиться