未初始化的存储uninitialized_x

除了,allocator空间分配器之外,<memory>中还有初始化容器标准库函数.

分别为:

template<typename _InputIterator, typename _ForwardIterator>
inline _ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last,_ForwardIterator __result)

 

template<typename _ForwardIterator, typename _Tp>
inline void uninitialized_fill(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __x)

 

template<typename _ForwardIterator, typename _Size, typename _Tp>
inline void uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp& __x)

 

/* 
 * File:   main.cpp
 * Author: Vicky.H
 * Email:  eclipser@163.com
 */
#include <iostream>
#include <memory>
#include <cstring>

struct st_A {
    char name[21];
    short age;
};


namespace cn_vicky_uninitialized {

    /**
     * stl的源码分析
     * @param first
     * @param n
     * @param val
     */
    template <class For, class Size, class T>
    inline void uninitialized_fill_n_stl(For first, Size n, const T& val) {
//        typedef typename std::iterator_traits<For>::value_type VT;
//        while (n--) std::_Construct(std::__addressof(*first++), static_cast<VT>(val));
        while (n--) std::_Construct(std::__addressof(*first++), val);
    }
    
    /**
     * 自定义简洁版
     * @param first
     * @param n
     * @param val
     */
    template <class For, class Size, class T>
    inline void uninitialized_fill_n(For first, Size n, const T& val) {
        typedef typename std::iterator_traits<For>::value_type VT;
        while (n--) new (static_cast<void*> (&*first++)) VT(val); /**区别于stl版本使用construct函数,我们使用new 来分配空间*/
    }
}

/*
 * 
 */
int main(void) {


    st_A st_A_arr[10];
    std::cout << st_A_arr[0].name << std::endl;
    std::cout << st_A_arr[0].age << std::endl;
    std::cout << st_A_arr[9].name << std::endl;
    std::cout << st_A_arr[9].age << std::endl;
    std::cout << "---------------------------" << std::endl;

    // 使用stl库函数填充
    st_A a;
    strcpy(a.name, "Vicky");
    a.age = 25;
    std::uninitialized_fill_n(st_A_arr, 10, a);
    std::cout << st_A_arr[0].name << std::endl;
    std::cout << st_A_arr[0].age << std::endl;
    std::cout << st_A_arr[9].name << std::endl;
    std::cout << st_A_arr[9].age << std::endl;
    std::cout << "---------------------------" << std::endl;
    
    strcpy(a.name, "Lily");
    a.age = 24;
    cn_vicky_uninitialized::uninitialized_fill_n_stl(st_A_arr, 10, a);
    std::cout << st_A_arr[0].name << std::endl;
    std::cout << st_A_arr[0].age << std::endl;
    std::cout << st_A_arr[9].name << std::endl;
    std::cout << st_A_arr[9].age << std::endl;
    std::cout << "---------------------------" << std::endl;
    
    // 使用自定义
    strcpy(a.name,"Jack");
    a.age = 18;
    cn_vicky_uninitialized::uninitialized_fill_n(st_A_arr, 10, a);
    std::cout << st_A_arr[0].name << std::endl;
    std::cout << st_A_arr[0].age << std::endl;
    std::cout << st_A_arr[9].name << std::endl;
    std::cout << st_A_arr[9].age << std::endl;
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值