Здравствуйте, B0FEE664, Вы писали:
R>>К результату "ab" могут привести, разве что, только такие особые виды итераторов, как back_insert_iterator и ostream_iterator. Но даже у этих операторов существует операция инкремента (просто она пустая).
BFE> | | вот именно |
| | BFE>BFE>#include <algorithm>
BFE>#include <iostream>
BFE>#include <iterator>
BFE>#include <vector>
BFE>int main()
BFE>{
BFE> std::vector<char> v;
BFE> std::back_insert_iterator<std::vector<char>> it(v);
BFE> *it = 'a';
BFE> *it = 'b';
BFE> for (auto n : v)
BFE> std::cout << n << ' ';
BFE> std::cout << '\n';
BFE>}
BFE>
BFE>вывод a b
BFE>https://coliru.stacked-crooked.com/a/21f80d6127889c39
|
| | |
Ну, по-моему, ты просто меняешь местами общий и частный случай. Просто это особый вид итераторов, для которго, что *it = 'a', что *it++ = 'a' — это без разницы. Для общего случая это ведь не так. А общий случай — это такой, который является обобшением указателя (как и сказано в стандарте). Т.е. при многократной записи без инкремента будет происходить многократная модификация одного и того же объекта (или изменение по месту, как ты это обозначил).
BFE>Кстати, что насчёт std::reverse ? Ему двунаправленные итераторы надобны.
А это-то ту при чём? Это уже следующая категория итераторов. Вопрос же был в чём — можно ли из названия "OutputIterator" ожидать модификации адресуемых итератором данных (изменения по месту). Ответ: да, в общем случае можно. Я выше даже ссылку приводил, где это прямо сказано.