Re[8]: Можно ли и как канонично получить из итератора тип эл
От: rg45 СССР  
Дата: 22.04.25 15:59
Оценка:
Здравствуйте, 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" ожидать модификации адресуемых итератором данных (изменения по месту). Ответ: да, в общем случае можно. Я выше даже ссылку приводил, где это прямо сказано.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 22.04.2025 16:06 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.