问题来源

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

以及在使用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. 第三章 基础算法和数据结构高频题 I

    区间类问题 1 Missing Interval public List<String> findMissingRanges(int[] nums, int lower, int uppe ...

  2. ld: warning: directory not found for option ''

    iOS开发中经常遇到这样的警告,如图所示: 原因是存在未用到的目录. 解决方法:选择Build Settings,找到Search Paths中的Library Search Paths,如下图 删除 ...

  3. Superset 官方入门教程中文翻译

    本文翻译自 Superset 的官方文档:Toturial - Creating your first dashboard 最新版本的 Superset 界面与功能上与文档中提到的会有些许出入,以实际 ...

  4. java在src/test/resourse下读取properties文件

    package com.jiepu; import java.io.File; import java.net.URISyntaxException; import java.util.Map; im ...

  5. maven的编译规范

    maven的中央仓库上的jar的包名必须小写.否则maven编译不通过. 如:Memcached-Java-Client-3.0.2 的jar包. 目录如下: com.whalin.memcached ...

  6. JavaFX Metro UI 和 开发库

    目录 [隐藏] 1 Metro UI For JavaFX! 1.1 例子 1.2 Switch 1.3 Button 1.4 案例: 2 ConsrolsFX 3 Notification 的使用 ...

  7. 直方图均衡基本原理及Python实现

    1. 基本原理 通过一个变换,将输入图像的灰度级转换为`均匀分布`,变换后的灰度级的概率密度函数为 $$P_s(s) = \frac{1}{L-1}$$ 直方图均衡的变换为 $$s = T(r) = ...

  8. 使用 RxJava 进行嵌套串行网络请求的一种方法

    需求 有这样一个列表数据,它包含了商店+订单的信息,获取订单列表时,订单实体中会包含商店的 ID,而列表显示时需要商店的名称和 logo,这时候就需要进行嵌套串行网络请求了. 关键词 flatMap ...

  9. JavaWeb——使用会话维持状态3

    这次的例子是使用会话给上一个例子添加登陆功能 1.页面逻辑 首先是登陆页面,这里需要输入账号和密码,输入正确后将进入商品列表页面,输入错误将会提示账号或者密码错误 其次是商品列表和购物车页面,添加了注 ...

  10. android ——后台下载

    这次的这个demo想要实现一个后台下载文件的功能,下载的时候会有一个告知进度的通知, 使用的依赖库就一个: compile 'com.squareup.okhttp3:okhttp:3.9.0' 大体 ...