动态数组& 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); //后一半空间的填充
动态数组& allocator的更多相关文章
- 动态数组、allocator 类
12.2 动态数组 12.2.1 new 和数组 1.分配一个动态数组即是在分配一个new对象时在类型名之后加一对方括号,用来存放数组大小,该数可以是任意表达式.也可以是0,只需是整形.无需是常量.数 ...
- 【足迹C++primer】40、动态数组
动态数组 C++语言定义了第二种new表达式语法.能够分配并初始化一个对象数组.标准库中包括 一个名为allocator的类.同意我们将分配和初始化分离. 12.2.1 new和数组 void fun ...
- C++ Primer 笔记——动态数组
1.动态数组定义时也需要指明数组的大小,但是可以不是常量. int i; int arr[i]; // 错误,数组的大小必须为常量 int *p = new int[i]; // 正确,大小不必是常量 ...
- 常用数据结构-线性表及Java 动态数组 深究
[Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...
- C语言 · 动态数组的使用
从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...
- C++中关于[]静态数组和new分配的动态数组的区别分析
这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...
- C++之动态数组
C99支持一种名为变长数组的结构来方便程序员.C++也提供了一种长度可在程序运行时确定的数组类型:动态数组.声明格式为:(声明 int 类型的数组) ; //此处可修改 ArraySize 的值 in ...
- VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法
1.默认属性 VB6.0有默认属性的特性.当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性.在某些情形下,省略常用属性名,使代码更为精简. 因为CommandBu ...
- C#有关数组内存的释放及动态数组问题
一.数组内存释放问题 数组内存的释放可以按照如下语句实现: string [] aa=new string[2]; aa[0]="A"; aa[1]="B"; ...
随机推荐
- php之布尔类型判断
字符串只要不为空且不为0都为true 执行结果为 执行结果为false 因为===不仅比较值,还比较类型,所以输出为false.如果使用===号比较,最好先将变量强转为bool类型,不然可能得不到想要 ...
- vue.js主要内容
vue的主要内容 1.了解vue 2.vue开发环境的搭建和脚手架工具的使用 3.vue具体的指令和项目实战 1.了解vue 1.具备基础:html.css.js,模块化概念.ES6语法(简单即可) ...
- Apache ActiveMQ 实践 <一>
一.下载最新版本 ActiveMq http://activemq.apache.org/activemq-5152-release.html,下载目录如下: 二.创建项目 1.普通项目 添加 jar ...
- 设置Myeclipse的jvm内存参数
Myeclipse经常会遇到内存溢出和Gc开销过大的情况,这时候就需要修改Myeclipse的Jvm内存参数 修改如下:(使用Extjs做公司大项目时候,不要让项目Builders的Javascrip ...
- 实时同步lsyncd
实时同步lsyncd 1 lsyncd 1.1 lsyncd 简介 Lsyncd使用文件系统事件接口(inotify或fsevents)来监视对本地文件和目录的更改.Lsyncd将这些事件整理几秒钟, ...
- istio入门教程
广告 | kubernetes各版本离线安装包 安装 安装k8s 强势插播广告 三步安装,不多说 安装helm, 推荐生产环境用helm安装,可以调参 release地址 如我使用的2.9.1版本 y ...
- CodeGlance右侧窗口缩略图消失不见
说明下问题,idea中的CodeGlance插件会在右侧显示缩略图,可以快速定位代码.今天遇到个问题升级了插件后右侧窗口消失.经过卸载插件,重启,reset一系列操作后还是没能恢复. 能去搜索引擎搜索 ...
- MySQL InnoDB Cluster介绍
目录 一.MySQL InnoDB Cluster介绍 二.环境准备 三.将MGR节点加入MySQL Cluster 四.问题汇总 五.性能测试 六.个人总结 一.MySQL InnoDB Clust ...
- java web 加载Spring --web.xml 篇
spring是目前最流行的框架.今天谈谈对spring的认识 起步 javaweb中我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中.略过,下面是一个标 ...
- Linux杀不死的进程之CPU使用率700%
1. 问题发现 [root@zwlbs3 ~]# top i. 发现有个进程CPU使用率居然700%,COMMAND 是一些随机的字符串组成,完了~ 中标了:第一想到就是“沙雕”它,kill 命令给我 ...