首页 > 代码库 > 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等函数的简单实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。