动态数组& allocator

问题来源

在编写程序的时候,对数组、“二维数组”的分配的删除掌握的不是很清楚,不能正确的进行定义初始化。
以及在使用vector的时候,如何正确的定义及初始化

注意!!!
尽量使用标准库容器vector而不是使用动态分配数组

动态数组

1.new 数组

int *pia=new int [10];                 // 10个未初始化的int
int *pia2=new int [10]() ;            // 10个初始化为0的int

string *psa=new string [10] ;       // 10个空string

string *psa2=new string [10]() ;   // 10个空string

delete [] pia;                             // 数组的释放
delete [] pia2; 

2.数组指针,指针数组

注意区分,在定义的过程中都会使用

int (*matrix)[10] ;                       //含有10个整数数组的指针
int matrix[][10];
// attention 
int *matrix [10];                         // 10个指针构成的数组

3.“二维数组”
c++中其实不存在“二维数组”,平常所说的二维数组是指 数组的类型是另一维数组;

int [2][3];            //是一个元素类型为 int[3] 的数组

new int[a][b]       //!!错误代码,没有确定数组的元素类型

// 使用new来创建二维数组,使用函数来展示其性质

void function1(int n)
{
    int i,j;
    int (*arr_2D)[5] = new int[n][5];  // 数组的元素类型为"int[5]"
    for(i=0;i<n;++i){
        for(j=0;j<5;++j){
            arr_2D[i][j]=i*5+j;
        }
    }
    delete [] arr_2D;                   // 数组的删除  
}

void function2(int n,int m)
{
    int i,j;
    int **arr_2D=new int *[n];             // n个指针组成的数组
    for(i=0;i<n;i++){
        arr_2D[i]=new int [m];          // 将每个指针指向一个数组
    }
    for(i=0;i<n;++i){                           // 进行赋值
        for(j=0;j<m;++j){
            arr_2D[i][j]=i*m +j;
        }
    }
    // delete
    // 先回收低级数组
    for(i=0;i<n;i++)
    {
        delete [] arr_2D[i];
    }
    // 回收高一级的数组
    delete [] arr_2D;
}

4.使用 vector

// 引入STL,会扩大程序 但是程序运行时间几乎不影响
#include<vector>
using namespace std;

vector<vector<int>> res (m, vector<int>(n,1))    // 构造n*m 数组 并将元素都初始化为1
allocator
  • new & delete局限性
    new 内存分配和对象构造组合在一起
    delete 对象析构和内存释放组合在一起

  • allocator类
    在头文件中
    允许分配内存和初始化进行分离。提供更好的性能及灵活的内存管理能力

分配的内存是未构造的

// how to use allocator
#include<memory>

allocator<string> alloc;                // 定义一个可以分配string的allocator对象
auto const p=alloc.allocate(n);      // 分配n个未初始化的string  

// 送了两个算法,在未初始化内存中创建对象,算法也在memory头文件中
uninitialized_copy(b,e,b2);        // 迭代器拷贝    begin-end
uninitialized_copy_n(b ,n,b2);   // begin开始  n个元素 拷贝到 b2开始的内存中
uninitialized_fill(b,e,t);            //  创建对象,对象的值均为 t的拷贝
uninitialized_fill_n(b, n,t);        // 到n n个对象



// 释放内存

allocator<T> a;
a.allocate(n);
a.deallocate(p,n);   // p指针开始
a.destory(p);        // 对p进行析构

一个使用的例子
将 一个有int的vector ,将其内容拷贝到动态内存中,我们分配一个比vector中元素所占空间大一倍的动态内存

拷贝到动态内存中,并将后一半空间定值填充。

#include<vector>
#include<iostream>
#include<memory>
vector<int> vi(10,1);
allocator<int> alloc;
auto p=alloc.allocate(vi.size() *2);   //  动态内存
auto q=uninitialized_copy(vi.begin(),vi,end(),p);  // 拷贝到p开始的内存 ,注意返回时递增后的目的位置迭代器
uninitialized_fill_n(q,vi.size(),0);                       //后一半空间的填充

转载于:https://www.cnblogs.com/GeekDanny/p/10728412.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值