Re[9]: std::list Сохранить позицию
От: a7d3  
Дата: 19.08.19 18:06
Оценка: +1
Здравствуйте, TailWind, Вы писали:

A>>Тогда через пустой список и потом slice – std::list Сохранить позицию

TW>Да я видел ваше решение — интересное

TW>У меня, к сожалению, не получится применить

TW>Так как функции, которые добавляют новые элементы анализируют значения существующих

А что на счет exception safety?
Это не логично — вносить изменения в объектную модель без возможности откатить неудачную транзакцию, если провалился один из этапов.
Re[10]: std::list Сохранить позицию
От: TailWind  
Дата: 19.08.19 18:42
Оценка:
A>А что на счет exception safety?
A>Это не логично — вносить изменения в объектную модель без возможности откатить неудачную транзакцию, если провалился один из этапов.
Такого не должно быть

Если выполнились все условия, код добавляет элементы в лист и возвращает true
Если не выполнились, ничего не делает, и возвращает false
Re[11]: std::list Сохранить позицию
От: a7d3  
Дата: 19.08.19 20:10
Оценка:
Здравствуйте, TailWind, Вы писали:

A>>А что на счет exception safety?

A>>Это не логично — вносить изменения в объектную модель без возможности откатить неудачную транзакцию, если провалился один из этапов.
TW>Такого не должно быть

TW>Если выполнились все условия, код добавляет элементы в лист и возвращает true

TW>Если не выполнились, ничего не делает, и возвращает false

Каковы гарантии безопасности по исключениям?
Каким образом возвращать список в изначальное состояние при досрочном завершении его обработки (из-за выскакивания исключения в каком-либо месте)?

Пример №1.
Есть библиотечная функция/процедура добавляющая какие-то элементы в список. Если она споткнется на каком-то этапе, то ее выполнение завершится досрочно — из нее вылетит исключение. В список она при этом успеет добавить лишь некоторые из элементов, но далеко не все, какие должна была бы. Каков сценарий развития событий дальше? Программа аварийно завершается прекращая какую-либо работу?

Пример №2.
Библиотечная функция отработала благополучно, но споткнулся тот код, отвечающий за завершающие действия (зная в какое место списка эта функция добавляла элементы). Список опять получился не в том состоянии, в каком должен был бы отработай все штатно. Тогда вся программа целиком подлежит аварийной остановке?
Re[12]: std::list Сохранить позицию
От: TailWind  
Дата: 20.08.19 14:57
Оценка:
A>Каковы гарантии безопасности по исключениям?
A>Тогда вся программа целиком подлежит аварийной остановке?

Вы интересную тему поднимаете
Но я, не настолько хороший программист чтобы её поддержать

Скорее всего сюжет будет следующий: функция была вызвана по нажатию кнопки или во время отрисовки окна. Там я забыл поставить try-catch. Исключение пойдёт в модуль с winapi, где будет поймано, выведено на экран и программа благополучно исчезнет с экрана
Re[13]: std::list Сохранить позицию
От: a7d3  
Дата: 21.08.19 11:26
Оценка:
Здравствуйте, TailWind, Вы писали:

A>>Каковы гарантии безопасности по исключениям?

A>>Тогда вся программа целиком подлежит аварийной остановке?

TW>Вы интересную тему поднимаете

TW>Но я, не настолько хороший программист чтобы её поддержать

TW>Скорее всего сюжет будет следующий: функция была вызвана по нажатию кнопки или во время отрисовки окна. Там я забыл поставить try-catch. Исключение пойдёт в модуль с winapi, где будет поймано, выведено на экран и программа благополучно исчезнет с экрана


Это так называемый «fail fast» — терпимо и актуально не для всех приложений.
Используется в тех случаях, когда проще быстро перезапустить софтину после «падения». Иногда дешевле/проще именно так, чем реализовывать корректную работу с исключениями в плане транзакционности изменений объектной модели внутри софтины (во избежание некорректных, частичных состояний).
Re: std::list Сохранить позицию
От: Кодт Россия  
Дата: 06.09.19 10:10
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Есть list<ULONG>


TW>В нём от нуля до любого числа элементов

TW>Нужно запомнить текущую позицию
TW>Потом вставить рандомное число элементов
TW>И в конце получить итератор на первый рандомный вставленный элемент

TW>В процедуру, которая вставляет рандомное число элементов у нас нет доступа

TW>Как?

Извиняюсь за поздний ответ!

Для списка целых чисел использовать std::list — накладно по памяти.
Нужна какая-то страничная структура. Возможно, подойдёт одностраничная — std::vector!
Для коротких списков операции вставки-удаления из середины — для вектора не так уж дороги. А для длинных — мы будем платить цену за хранение, и ещё неизвестно, что выйдет дешевле.
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.