美文网首页C++
动态数组

动态数组

作者: saviochen | 来源:发表于2017-06-17 12:18 被阅读66次

newdelete只能一次分配释放一个对象,一些场合,我们需要一次为很多对象分配内存,为了支持这种需求,C++标准库提供了两种方法:newallocator

1 new和数组

一些基本的语法

int *a = new int[get_size()];
int *a = new string[100]();
int *a = new string[10]{"a","b","c",string(3,'x')};
typedef int att[10];
int *a = new att;
delete []a;

智能指针和动态数组可以用unique_ptr管理动态数组,语法如下:

unique_ptr<int[]> up(new int[10]);
up[i] = 10;
up.release();//自动调用delete[]释放指针

\\此时,指向数组的unique ptr不支持成员访问运算符即 . 和 -> 运算符
\\其他unique ptr操作保持不变

unique_ptr不同,shared_ptr不支持直接管理动态数组,需要自己定义的删除器:

shared_ptr<int> sp(new int[10],[](int *p){delete []p;});//此处使用了lambda表达式
shared_ptr未定义下标运算符,并且不支持指针算术运算符
*(sp.get()+i) = i; //i为我们要访问的下标

2 allocator类

newdelete有一些灵活性的局限,将内存分配(释放)和对象构造(析构)组合在了一起,有时这会造成浪费。

标准库allocater类定义在头文件memory中,它帮助我们将对象构造和内存分配分离开,它提供一种类型感知的内存分配方法,它分配的内存是原始的,未构造的。

//定义allocator对象,它可以为类型为T的对象分配内存
allocator<T> a;

//分配一段原始的、未构造的内存,保存n个类型为T的对象
auto p = a.allocate(n);

//在p指向的内存中构造一个对象
a.construct(p,args);

//对p指向的对象执行析构函数
a.destroy(p);

//释放从T*指针 p中地址开始的内存,这块内存保存了n个对象;
//p必须先用allocate分配返回的指针,并且需要使用destroy析构对象后才能调用deallocate
a.deallocate(p,n);

以下为使用示例:

allocator<string> alloc;
auto const p = alloc.allocate(n);//分配n个未初始化的string

auto q = p;
alloc.construct(q++);//*p为空字符串

alloc.construct(q++,10,'c');//*p为cccccccccc

alloc.construct(q++,"h1");//*p为hi

while(q!=p)
    alloc.destroy(--q);//被销毁后,可以重新构造,注意是前置--
alloc.deallocate(p,n);

标准库还为allocator类定义了两个伴随算法,用来进行拷贝和填充操作:

//从迭代器b和e指出的范围中拷贝元素到迭代器b2开始的未构造内存中
uninitialized_copy(b,e,b2);

//将从迭代其b开始n个元素拷贝到迭代器b2开始的内存中
uninitialized_copy(b,n,b2);

//在迭代器b和e指出的范围中创建t的拷贝对象(多个)
uninitialized_fill(b,e,t);

//从b开始的内存中创建n个t对象
uninitialized_fill(b,n,t);

相关文章

  • 20_总结

    一、动态数组 普通动态数组 环形动态数组 接口设计 int size(){} // 元素的数量 boolean i...

  • C语言动态数组

    一维动态数组 二维动态数组

  • C语言 泛型动态数组

    泛型实现思路:万能指针void *动态数组实现思路:动态进行数组内存的扩容 realloc 泛型动态数组 数组可以...

  • C++ 动态顺序表的实现(更新中)

    动态数组与数组相似,但是动态数组的大小可以在运行时动态修改。动态数组的元素占用连续的内存块,一旦创建,就无法更改其...

  • 笨办法学C 练习34:动态数组

    练习34:动态数组 原文:Exercise 34: Dynamic Array 译者:飞龙 动态数组是自增长的数组...

  • VBA之数组

    数组的声明 一维数组 二维数组 动态数组

  • 数据结构大纲

    1、线性表 1.1、数组 1.1.1、简介 数组是一段连续的内存 1.1.2、动态数组 有动态扩容功能和动态缩容功...

  • 关于ArrayList

    ArrayList简介 ArrayList内部是以动态数组存放数据的,所谓动态数组,不是数组本身可以改变长度,而是...

  • 2018-11-28

    vector容器。 vector类称为向量类,实现了动态数组,用于元素数组动态变化的对象数组。同数组一样,vect...

  • C++ 创建动态二维数组

    有时候数组过大,栈放不下,可以利用动态分配生成动态数组 动态创建数组时一定要记得结束程序时释放内存。

网友评论

    本文标题:动态数组

    本文链接:https://www.haomeiwen.com/subject/wuivqxtx.html