标准库Allocator(三)uninitialized_fill等函数的实现

前面我们使用了uninitialized_fill,来批量初始化某一段内存。

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

1.遇到错误,抛出异常

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

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

#ifndef MEMORY_HPP
#define MEMORY_HPP

#include <iterator>

template <typename ForwIter, typename T>
void uninitialized_fill(ForwIter beg, ForwIter end, const T & value)
{
    typedef typename std::iterator_traits<ForwIter>::value_type VT;
    ForwIter save(beg); //备份beg的初始值
    try
    {
        for(; beg != end ; ++beg)
        {
            new (static_cast<void *>(&*beg))VT(value);
        }
    }
    catch(...) //抛出异常
    {
        for(; save != beg; ++save)
        {
            save->~VT();    //逐个进行析构
        }
        throw; //将catch的异常再次抛出
    }
}

template <typename ForwIter, typename Size, typename T>
void uninitialized_fill_n(ForwIter beg, Size num, const T & value)
{
    typedef typename std::iterator_traits<ForwIter>::value_type VT;
    ForwIter save(beg);
    try
    {
        for(; num-- ; ++beg)
        {
            new (static_cast<void *>(&*beg))VT(value);
        }
    }
    catch(...)
    {
        for(; save != beg; ++save)
        {
            save->~VT();
        }
        throw;
    }
}

template <typename InputIter, typename ForwIter>
void uninitialized_copy(InputIter beg, InputIter end, ForwIter dest)
{
    typedef typename std::iterator_traits<ForwIter>::value_type VT;
    ForwIter save(dest);
    try
    {
        for(; beg != end ; ++beg, ++dest)
        {
            new (static_cast<void *>(&*dest))VT(*beg);
        }
    }
    catch(...)
    {
        for(; save != dest; ++save)
        {
            save->~VT();
        }
        throw;
    }
}

#endif /* MEMORY_HPP */

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

时间: 2024-12-22 20:36:47

标准库Allocator(三)uninitialized_fill等函数的实现的相关文章

标准库Allocator的使用(一)

上一篇我们提到了new运算符以及它的工作步骤,其实无非是把两项工作独立出来: 1.申请原始内存 2.执行构造函数 delete也涉及了两个工作: 1.执行析构函数 2.释放原始内存 其实标准库提供了另外一种更加高级的手段实现内存的分配和构造,就是std::allocator<T>的职责.   allocator提供了四个操作: a.allocate(num) 为num个元素分配内存 b.construct(p) 将p所指的元素初始化 destroy(p) 销毁p指向的元素 deallocate

走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

我的memcmp: 1 int memcmp(void *buf1, void *buf2, unsigned int count){ 2 int reval; 3 while(count && !(reval = (*(unsigned char *)buf1) - (*(unsigned char *)buf2))) 4 { 5 buf1 = (unsigned char *)buf1 + 1; 6 buf2 = (unsigned char *)buf2 + 1; 7 --count

c++标准库里的sort()排序函数

Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!一,sort()排序函数的使用方法I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!II)Sort函数有三个参数:Sort(start,end,排序方法)(1)第一

走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数

我的strcat: 1 char *strcat(char *dest,char *src) 2 { 3 char * reval = dest; 4 while(*dest) 5 dest++; 6 while(*src) 7 *dest++ = *src++ ; 8 *dest = *src; 9 return reval; 10 } MSVC: 1 char * __cdecl strcat ( 2 char * dst, 3 const char * src 4 ) 5 { 6 char

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 unin

C++标准库之vector(各函数及其使用全)

原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5280566.html iterator类型: iterator:到value_type的访问,value_type是模板的类型 const_iterator:到const value_type的访问 reverse_iterator:reverse_iterator<iterator> const_reverse_iterator:reverse_iterator<const_itera

标准库Allocator的简易实现(二)

自己实现Allocator并不难,其实只需要改变allocate和deallocate,来实现自己的内存分配策略.   下面是一个std::allocator的模拟实现 #ifndef ALLOCATOR_HPP #define ALLOCATOR_HPP #include <stddef.h> #include <limits> template <typename T> class Allocator { public: typedef size_t size_ty

走进C标准库(6)——"string.h"中函数的实现memchr

我写的memchr: 1 void *memchr(const void *buf, char ch, unsigned count){ 2 unsigned int cnt = 0; 3 while(*(buf++) != ch && cnt <= count){cnt++;} 4 if(cnt > count) 5 return NULL; 6 else 7 return buf; 8 } 红色部分报错. 该错误为为ANSIC中认定的错误,是因为它坚持:进行算法操作的指针必

C++标准库(三)之STL算法

算法头文件: #include<algorithm> #include<numeric> 算法简介:STL算法采用覆盖模式而非安插模式,所以调用者必须保证有足够的操作空间. 函数对象类型声明: UnaryProc:Op(elem),无返回值 CompFunc:Op(elem1,elem2),返回True或者False UnaryPredicate:Op(elem),返回True或者False BinaryPredicate:Op(elem,value),返回True或者False