问题来源

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

以及在使用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. IrisSkin2.dll 添加皮肤

    使用说明:把控件拖到你的form上,只需一行代码,即可实现整个form包括其所有控件的皮肤的更换,总共有几十套皮肤供使用,非常方便.省去你设计开发软件皮肤系统的时间和精力.全部源代码就一行: skin ...

  2. 机器学习之使用sklearn构造决策树模型

    一.任务基础 导入所需要的库 import matplotlib.pyplot as plt import pandas as pd %matplotlib inline 加载sklearn内置数据集 ...

  3. python输出九九乘法表

    1.脚本如下 (1)倒三角格式的,注意行前的空格 for i in range(1,10):     for j in range(i,10):          print("%d*%d= ...

  4. Shell基本语法---常见的条件判断

    语法 [ 判断表达式 ] 文件夹或路径是否存在 -e 目标是否存在(exist) -d 是否为路径(directory) -f 是否为文件(file) [ -e text.sh ] || touch ...

  5. 利用dockerfile 安装一个tomcat7

    FROM docker.io/centos #定义自己的说明 MAINTAINER jim ming "107420988@qq.com" #切换镜像目录,进入/usr/local ...

  6. 【有容云干货-容器系列】Kubernetes调度核心解密:从Google Borg说起

    在之前“容器生态圈脑图大放送”文章中我们根据容器生态圈脑图,从下至上从左至右,依次介绍了容器生态圈中8个组件,其中也提到Kubernetes ,是一个以 Google Borg 为原型的开源项目.可实 ...

  7. Dialog 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  8. SpringBoot入门及YML文件详解

    SpringBoot 简介 微框架,与 Spring4 一起诞生,基于约定.生来为了简化 spring 的配置 优点 可以快速的上手,整合了一些子项目(开源框架或者第三方开源库) 可以依赖很少的配置快 ...

  9. XML学习(一)

    本文主要记录xml学习过程中的一些笔记,包括xml作用,语法以及解析. 1.HTML和XML的区别 1.1.HTML 名称:     HyperText Markup Languae(超文本标记语言) ...

  10. 直击根源:微信小程序中web-view再次刷新后页面需要退两次

    背景 在上一章(直击根源:vue项目微信小程序页面跳转web-view不刷新)解决了vue在小程序回退不刷新的问题之后,会引出了一个刷新的页面需要点击返回两次才能返回上一个页面 问题描述 在A页面从B ...