// strong_copy: Copy range with strong guarantee
#include <vector>
#include <algorithm>
#include <iterator>

template< typename InputIterator , typename ForwardIterator >
ForwardIterator strong_copy( InputIterator first , InputIterator last , ForwardIterator result )
{
  typedef typename std::iterator_traits< ForwardIterator >::value_type value_type;
  std::vector< value_type > backup;
  ForwardIterator const result_first = result;
  try
  {
    while( first != last )
    {
      backup.push_back( *result );
      *result = *first;
      ++result;
      ++first;
    }
    return result;
  }
  catch( ... )
  {
    std::swap_ranges( backup.begin() , backup.end() , result_first );
    throw;
  }
}
// ・入力も ForwardIterator に狭めれば backup に reserve をかけることができる
// ・reserve できないなら、 backup は vector よりも list,deque のほうがいいかも