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;
  }
}