Является ли vector<int>:: const_iterator output_iterator?
Согласно концепции C++:
Любой итератор, кроме input_iterator, является output_iterator.
vector<int>::const_iterator
это random_access_iterator
и, конечно, это output_iterator
,
Однако, согласно cppreference.com, output_iterator
должно быть доступно для записи, в то время как vector<int>::const_iterator
не является.
Является vector<int>::const_iterator
output_iterator
?
Смотрите также: Как проверить, является ли итератор output_iterator в C++?
3 ответа
Нет. vector<int>::const_iterator
является постоянным итератором ( http://eel.is/c++draft/container.requirements.general), что означает, что он не удовлетворяет требованиям выходных итераторов.
http://eel.is/c++draft/iterator.requirements.general:
Итераторы, которые дополнительно удовлетворяют требованиям выходных итераторов, называются непостоянными итераторами. Неизменяемые итераторы называются постоянными итераторами.
Vector::const_iterator является random_access_iterator и, конечно, является output_iterator.
Это просто неправильно.
Смотрите здесь: Cpp Reference
OutputIterator - это итератор, который может записывать в указанный элемент.
Очевидно, что ваша цитата означает, что любой итератор, который не удовлетворяет требованиям итератора ввода, является итератором вывода.
Стандартная иерархия категорий итераторов определяет (см. 24.2.1) следующую последовательность категорий итераторов с вложенными требованиями
Произвольный доступ -> Двунаправленный -> Вперед -> Ввод
в то время как выходной итератор категории стоит отдельно.
Это вложение означает, что каждый прямой итератор также является входным итератором (т.е. также удовлетворяет требованиям категории входного итератора), каждый двунаправленный итератор также является прямым и входным итератором одновременно. Это контекст, в котором ваш вполне должен интерпретироваться.
std::vector::const_iterator
является итератором с произвольным доступом, который также удовлетворяет требованиям двунаправленного, прямого и входного итератора. В этом смысле std::vector::const_iterator
является итератором ввода (!). По этой причине ваша цитата не может быть использована для вывода, что это итератор вывода.
Дальнейшее подразделение на изменяемые итераторы и неизменяемые (постоянные) итераторы применяется поверх этого, но в этом случае нет необходимости вносить это в картину.