问题来源

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

以及在使用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的更多相关文章

  1. 动态数组、allocator 类

    12.2 动态数组 12.2.1 new 和数组 1.分配一个动态数组即是在分配一个new对象时在类型名之后加一对方括号,用来存放数组大小,该数可以是任意表达式.也可以是0,只需是整形.无需是常量.数 ...

  2. 【足迹C++primer】40、动态数组

    动态数组 C++语言定义了第二种new表达式语法.能够分配并初始化一个对象数组.标准库中包括 一个名为allocator的类.同意我们将分配和初始化分离. 12.2.1 new和数组 void fun ...

  3. C++ Primer 笔记——动态数组

    1.动态数组定义时也需要指明数组的大小,但是可以不是常量. int i; int arr[i]; // 错误,数组的大小必须为常量 int *p = new int[i]; // 正确,大小不必是常量 ...

  4. 常用数据结构-线性表及Java 动态数组 深究

    [Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...

  5. C语言 · 动态数组的使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...

  6. C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...

  7. C++之动态数组

    C99支持一种名为变长数组的结构来方便程序员.C++也提供了一种长度可在程序运行时确定的数组类型:动态数组.声明格式为:(声明 int 类型的数组) ; //此处可修改 ArraySize 的值 in ...

  8. VB默认属性、动态数组、Range对象的默认属性的一点不成熟的想法

    1.默认属性 VB6.0有默认属性的特性.当没有给对象指定具体的属性时,"默认属性"是VB6.0将使用的属性.在某些情形下,省略常用属性名,使代码更为精简. 因为CommandBu ...

  9. C#有关数组内存的释放及动态数组问题

    一.数组内存释放问题 数组内存的释放可以按照如下语句实现: string [] aa=new string[2]; aa[0]="A"; aa[1]="B"; ...

随机推荐

  1. java名词

    1 applet Java语言编写的小程序,可以包含在html页面中,有支持Java语言的浏览器执行,作用是在页面产生动态效果. 2 jdk java development kit java 开发环 ...

  2. 14. 流、文件和IO

    前言 InputStream/OutStream流用来处理设备之间的数据传输 Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持 ...

  3. Python实现批量处理扫描特定目录

    ## 简述在渗透测试中遇到相同CMS站点时,搞定一个站点,相当于拿了一个站群的通用漏洞,所以我们首先需要标注站点的CMS类型,根据要求编写如下脚本 ## 要求1.访问特定目录,如:站点特定 /cmsa ...

  4. 使用用树莓派打造远程WEB服务器

    简介:系统配置Raspberry Pi 3B + Raspbian + MySQL5.7 + Tomcat 9 + Nginx + 公网IP. 工具:Win32DiskImager .FileZill ...

  5. drf之序列化

    在django视图中使用serializer 只是使用serializer类编写API视图,没有用到REST框架 app01下的models.py from django.db import mode ...

  6. S2:log4j

    配置步骤 1.引入jar,放到lib中,jar包被项目管理 2.在src目录下copy了一个文件log4j.properties 3.使用Logger   String word="会员登记 ...

  7. 【Java例题】5.5 映射类的使用

    5.映射类的使用.使用HashMap保存英文-中文对照单词词典.单词词典可以增加和删除词汇.输入一个英文单词,翻译成中文并显示.输入一个中文单词,翻译成英文并显示. package chapter6; ...

  8. Tomcat源码分析 (二)----- Tomcat整体架构及组件

    前言 Tomcat的前身为Catalina,而Catalina又是一个轻量级的Servlet容器.在美国,catalina是一个很美的小岛.所以Tomcat作者的寓意可能是想把Tomcat设计成一个优 ...

  9. windwos环境下安装python2和python3

    一 python安装 下载地址: https://www.python.org/downloads/ 环境变量:Path中添加C:\Python27\Scripts\;C:\Python27\; C: ...

  10. viewpager_轮播

    public class MainActivity extends Activity { private ViewPager pager; private int[] id={R.layout.lay ...