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

Сообщение Re[5]: std::list Сохранить позицию от 18.08.2019 15:40

Изменено 18.08.2019 15:41 watchmaker

Re[5]: std::list Сохранить позицию
Здравствуйте, TailWind, Вы писали:

V>>И то верно. Тогда не back(), а end() — 1.

TW>И как мне из него получить итератор на "4"?

Думаю, Vamp намекал на такое решение:
auto q = std::prev(List.end());
...
auto qq = std::next(q);


TW>Который учитывает, что изначально в лист мог быть пустым

Но такой код, действительно, не сработает для пустого списка.
Но ты можешь обработать этот случай отдельно
Например, запомнить, что изначально список был пуст, а значит вместо std::next(q) нужно взять List.begin().
Либо можно воспользоваться одним из трюков по работе со списками: например, вставить заголовочный элемент; или воспользоваться возможностью сделать splice за O(1) и передавать в недоступный код всегда пустой список, а потом мгновенно их объединять.
Re[5]: std::list Сохранить позицию
Здравствуйте, TailWind, Вы писали:

V>>И то верно. Тогда не back(), а end() — 1.

TW>И как мне из него получить итератор на "4"?

Думаю, Vamp намекал на такое решение:
auto q = std::prev(List.end());
...
auto qq = std::next(q);


TW>Который учитывает, что изначально в лист мог быть пустым

Но такой код, действительно, не сработает для пустого списка.
Но ты можешь обработать этот случай отдельно
Например, запомнить, что изначально список был пуст, а значит вместо std::next(q) нужно взять List.begin().
Либо можно воспользоваться одним из трюков по работе со списками: например, вставить заголовочный элемент; или воспользоваться возможностью сделать splice за O(1) и передавать в недоступный код всегда пустой список, а потом мгновенно их объединять. Тогда отдельно рассматривать случай пустого исходного списка не придётся.