Информация об изменениях

Сообщение Re[6]: Можно ли и как канонично получить из итератора тип эл от 22.04.2025 14:58

Изменено 22.04.2025 15:28 rg45

Re[6]: Можно ли и как канонично получить из итератора тип эл
Здравствуйте, B0FEE664, Вы писали:

BFE>Изменение по месту я понимаю так:

BFE>
BFE>*it = 'a';
BFE>*it = 'b';
BFE>

BFE>результат: "...b...", а не "...ab...".

К результату "ab" могут привести, разве что, такие специальные виды итераторов, как back_insert_iterator и ostream_iterator. Но даже у этих операторов формально существует операция инкремента (просто она ничего не делает). У этих итераторов операции *it = 'a' и *it++ = 'a' имеют один и тот же эффект. Но эти итераторы — это особый случай.

В самом же общем случае итератор является обобщением указателя и для того, чтобы получить последовательность ("ab"), итератор нужно инкрементить. Что и делают алгоритмы тип std::copy, std::fill, etc. А без этого инкремента это и будет многократное изменение одного и того же элемента (изменение по месту, как ты это называешь).
Re[6]: Можно ли и как канонично получить из итератора тип эл
Здравствуйте, B0FEE664, Вы писали:

BFE>Изменение по месту я понимаю так:

BFE>
BFE>*it = 'a';
BFE>*it = 'b';
BFE>

BFE>результат: "...b...", а не "...ab...".

К результату "ab" могут привести, разве что, такие специальные виды итераторов, как back_insert_iterator и ostream_iterator. Но эти операторы — это особый случай — у них операция инкремента, хоть и существует формально, но не имеет никакого эффекта. У этих итераторов операции *it = 'a' и *it++ = 'a' имеют один и тот же результат.

В самом же общем случае итератор является обобщением указателя и для того, чтобы получить последовательность ("ab"), итератор нужно инкрементить. Что и делают алгоритмы тип std::copy, std::fill, etc. А без этого инкремента это и будет многократное изменение одного и того же элемента (изменение по месту, как ты это называешь).