动态数组、allocator 类
12.2 动态数组
12.2.1 new 和数组
1.分配一个动态数组即是在分配一个new对象时在类型名之后加一对方括号,用来存放数组大小,该数可以是任意表达式、也可以是0,只需是整形、无需是常量。数组分配成功后返回一个指向第一个对象的指针。
2.该分配的动态数组并非是数组类型,也就不能调用数组的begin和end函数,更不能使用需要begin函数的范围for语句。
3.我们可以在方括号后面跟一对空括号,来对数组进行值初始化,空括号内不能给出初始化器,从而也就不能用auto来分配数组了(因为auto需要通过初始化器来推断数组类型),但是我们可以用一个初始值列表来代替空括号,列表里的初识值用来初始化数组,但是初始值的数量不能大于数组大小。
4.释放动态数组用delete[ ]p,[ ]必不可少。
5.除了可以通过下标运算符访问数组还可以通过此for循环来访问数组:for(int * q = p; q != p + n; ++q)
6.用智能指针unique_ptr管理动态数组:定义时需指明数组大小且需在对象类型后面跟一对空方括号,以示分配的内存为数组,例如:unique_ptr<int[]>up(new int[10];该智能指针接受下标运算符来访问数组元素。 for (size_t i = 0; i != 10; ++i) up[i] = i;
释放该数组则调用release()成员函数,该函数会自动使用delete[]来释放内存。
7.如果要用shared_ptr来管理动态内存,则需提供自己的删除器:例如:
shared_ptr<int>sp(new int[10], [](int *p) { delete[] p; });释放该数组用reset()函数。
该智能指针不支持下标操作,访问则需用get()函数返回一个内置指针for (size_t i = 0; i != 10; ++i) *(sp.get() + i) = i;
12.2.2 allocator 类
1.allocator允许用户先分配内存,再构造对象,分配内存用a.allocate(n),该函数返回一个指向首个内存的指针,构造对象用a.contrucr(q++, args),args可以是所构造对象类型的任意构造函数的参数列表。
2.使用或访问内存之前必须构造对象
3.a.destroy(q)用来释放对象,而非释放内存,因为是释放对象,所以只有构造了对象的内存才能用此函数,,释放内存用a.deallocate(p, n),n必须和所分配的内存数量大小相等,且释放内存之前必须释放对象。
4.拷贝和填充未初始化内存的算法:
动态数组、allocator 类的更多相关文章
- 动态数组& allocator
问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...
- C++学习之动态数组类的封装
动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...
- python数据结构之动态数组
数组列表:动态数组(Array List) 简介: 最基础简单的数据结构.最大的优点就是支持随机访问(O(1)),但是增加和删除操作效率就低一些(平均时间复杂度O(n)) 动态数组也称数组列表,在py ...
- 用最复杂的方式学会数组(Python实现动态数组)
Python序列类型 在本博客中,我们将学习探讨Python的各种"序列"类,内置的三大常用数据结构--列表类(list).元组类(tuple)和字符串类(str). 不知道你发现 ...
- ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)
一.基本概念 ArrayList是一个可以添加对象元素,并进行元素的修改查询删除等操作的容器类.ArrayList底层是由数组实现的,所以和数组一样可以根据索引对容器对象所包含的元素进行快速随机的查询 ...
- 模仿.NET框架ArrayList写一个自己的动态数组类MyArrayList,揭示foreach实现原理
通过.NET反编译工具可以查看到ArrayList内部的代码,发现ArrayList并非由链表实现,而是由一个不断扩容的数组对象组成. 下面模仿ArrayList写一个自己的MyArrayList. ...
- C++ Primer : 第十二章 : 动态内存之allocator类
标准库allocator类定义在头文件 <memory>中.它帮助我们将内存分配和构造分离开来,它分配的内存是原始的.未构造的. 类似vector,allocator也是一个模板类,我们在 ...
- 封装动态数组类Array
功能: 1.增.删.改.查 2.扩容.缩容 3.复杂度分析 4.均摊复杂度 5.复杂度震荡 分析动态数组的时间复杂度: 分析resize的时间复杂度: public class Array<E& ...
- 【足迹C++primer】40、动态数组
动态数组 C++语言定义了第二种new表达式语法.能够分配并初始化一个对象数组.标准库中包括 一个名为allocator的类.同意我们将分配和初始化分离. 12.2.1 new和数组 void fun ...
随机推荐
- javascript 权威指南二
1.JavaScript程序是用Unicode字符集编写的.Unicode 是ASCII和Latin-1的超级,并支持地球上几乎所有在用的语言. 2.JavaScript是区分大小写的语言.HTML并 ...
- Java集合之Arrays 剖析
Arrays工具类位于 java.util 包下,是一个比较常用的工具类,其可以针对数组进行各种操作,比如赋值.排序.搜索等等.在项目过程中我们针对数组的有关操作,如果不方便直接操作,均可通过调用此类 ...
- PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
- mysql 基础sql语法总结(一)DDL
mysql数据库: SQL数据库语言可分为四部分: 1.DDL:对数据库或表的进行操作结构操作 2.DML:对表的记录进行更新(增.删.改)* 3.DQL:对表的内容进行查询 **(重难点) 4.DC ...
- ubuntu18.04 安装与卸载 php7.2
安装: 如果之前有其他版本PHP,在这边禁用掉 1 sudo a2dismod php5 再来安装做准备 1234 sudo apt-get install software-properties-c ...
- 八连通(vector动态数组法)
题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存.用二维的动态vector就能很好的解决这个问题 #include<bits/stdc++ ...
- [Python]BeautifulSoup安装与使用
1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据 ...
- ubuntu set up 3 - cuda
https://www.pugetsystems.com/labs/hpc/How-to-install-CUDA-9-2-on-Ubuntu-18-04-1184/ How to install C ...
- meet in the middle 折半搜索 刷题记录
复杂度分析 假设本来是n层,本来复杂度是O(2^n),如果meet in middle那就是n/2层,那复杂度变为O( 2^(n/2) ),跟原来的复杂度相比就相当于开了个方 比如如果n=40那爆搜2 ...
- zabbix的web界面出现乱码解决方案
1.问题描述:当我们搭建好zabbix服务器后,查看监控信息时,发现数据显示的下端文字显示为乱码. 2.解决方式: (1)拷贝windows系统字体: 可根据各自的喜好进行选择,我这边就选择楷体 常规 ...