首页 > 代码库 > Allocator中uninitialized_fill等函数的简单实现

Allocator中uninitialized_fill等函数的简单实现

下面提供三个函数的实现代码,这三个代码的共同点是:

1.遇到错误,抛出异常

2.出现异常时,把之前构造的对象全部销毁

所以,这三个函数要么成功,要么无任何副作用。使用异常来通知使用者,所以在catch块中,处理完异常后要将异常再次向外抛出

代码如下:

 1 #ifndef UNINIT_H 2 #define UNINIT_H 3 #include <iterator> 4  5 template <typename ForwIter, typename T> 6 void uninitialized_fill(ForwIter first, ForwIter last, const T &value) 7 { 8     typedef typename std::iterator_traits<ForwIter>::value_type VT; 9     ForwIter save(first);10     try11     {12         for( ; first != end; ++ first)13             new(static_cast<void *>(&*first))VT(value);14     }15 16     catch(...)17     {18         for( ; save != first; ++ save)19             save->~VT();20         throw();21     }22 }23 24 template <typename ForwIter, typename Size, typename T>25 void uninitialized_fill_n(ForwIter first, Size n, const T &value)26 {27     typedef typename std::iterator_traits<ForwIter>::value_type VT;28     ForwIter save(first);29     try30     {31         for( ; -- n; ++ first)32             new(static_cast<void *>(&*first))VT(value);33     }34     catch(...)35     {36         for( ; save != first; ++ save)37             save->~VT();38         throw();39     }40 41 }42 43 template <typename InputIter, typename ForwIter>44 void uninitialized_copy(InputIter first, InputIter last; ForwIter dest)45 {46     typedef typename std::iterator_traits<ForwIter>::value_type VT;47     ForwIter save(dest);48     try49     {50         for( ; first != last; ++ first, ++ dest)51             new(static_cast<void *>(&*dest))VT(*first);52     }53     catch(...)54     {55         for( ; save != dest; ++ save)56             save->~VT();57         throw();58     }59 60 }61 62 #endif

可以用前面的代码自行测试。

Allocator中uninitialized_fill等函数的简单实现