Listing 1: Adding new elements to the rollback list.
template <class T, class ForwardIterator> void strong_insert(std::set<T> c, ForwardIterator first, ForwardIterator last) { typedef typename std::set<T>::iterator set_iterator; std::deque<set_iterator> rollback_temp; try { while ( first != last ) { std::pair<set_iterator,bool> result = c.insert( *first ); if ( result.second ) { try { rollback_temp.push_back(result.first); } catch ( ... ) { c.erase( result.first ); throw; // skip to outer catch block } } ++first; } } catch ( ... ) { typedef typename std::deque<set_iterator>::iterator deque_iterator; // remove rollback list elements for ( deque_iterator i = rollback_temp.begin(); i != rollback_temp.end(); ++i ) { c.erase( *i ); } throw; } }