Вот что я хотел бы сделать:
- Переместить попытку / перехватить за пределы цикла
- Создать дубликат контейнера
bankAccounts
- Перебрать подубликат контейнера, вызывающий
increaseBalance
для каждого элемента - Если цикл успешно завершен,
swap()
оригинал и дубликат контейнера
Код будет выглядеть примерно так:
std::vector<bankAccount> bankAccounts;
...
std::vector<bankAccount> tmp(bankAccounts);
try
{
for (iter = tmp.begin(); iter != tmp.end(); ++iter)
{
iter->increaseBalance(50);
}
bankAccounts.swap(tmp);
}
catch (...)
{
}
Обратите внимание, что удержание указателя на объект внутри std::vector
, как правило, не очень хорошая идея, поскольку контейнер ожидает, что хранимые в нем данные имеют семантику значений, а не семантику указателей.Это может привести к зависанию указателей, утечкам памяти, а также требует дополнительного кода очистки, который вам не нужен в противном случае (для удаления элементов в контейнере вручную).С помощью приведенного выше кода я переключился на хранение данных внутри вектора, если это не вариант, вам нужно убедиться, что вы используете глубокое копирование вручную при копировании вектора.
На самом делеВы можете сократить код до следующего, если предположите, что для bankAccounts
и tmp
используются одни и те же определения:
std::for_each(tmp.begin(), tmp.end(),
std::mem_fun_ref(&bankAccount::increaseBalance, 50));
bankAccounts.swap(tmp);
Основное преимущество приведенного выше кода состоит в том, что в обоих случаях он безопасен для исключенийбез какой-либо дополнительной специальной обработки.