怎样在数组末尾添加数据_如何利用C++实现可变长的数组?

应该执行什么功能?

假设我们要实现一个将自动扩展的数组类,是否需要实现函数?让我们从下面主要功能使用的功能开始,看看我们需要实现哪些功能。

7c1343979bf644055e6fc14abd98f9e0.png


输出结果:

0 1 2 3 4

0 1 2 100 4

您需要做什么才能实现上述功能?首先列出:

  • 若要使用动态分配的内存来存储数组元素,并且需要一个指针成员变量

  • 重载分配=运算符

  • 重载括号[]运算符

  • 重载的副本构造函数

  • 实现push_back和length函数


- 2 -

实现步骤

要实现可变长度数组类,您基本上需要实现以下7个功能:

f9b54b775dcb3bfabd23a330fb448cb2.png

01构造函数

构造函数的目的是初始化一个数组,代码如下:

// 构造函数MyArray::MyArray(int s = 0):m_size(s){    // 当初始化长度为0的数组时,数组指针就是空的    if(s == 0)        m_ptr = NULL;    // 当初始化长度不为0时,则申请对应大小的空间    else        m_ptr = new int[s];

02复制构造函数

复制构造函数的目的是产生一个与输入对象相同的对象,但是由于MyArray类具有指针成员变量,因此必须使用深层复制来实现复制构造函数。如果使用默认的复制构造函数,则使两个对象的指针成员变量指向同一地址将非常危险。

// 复制构造函数MyArray::MyArray(const MyArray &a){    // 如果入参的数组对象的指针地址为空时,    // 则也初始化一个空的数组    if(a.m_ptr == NULL)    {        m_ptr = NULL;        m_size = 0;    }    // 如果入参的数组对象有数据时,则申请一个新的地址,    // 最后来复制入参对象数组对象的数据和大小。    else    {        m_ptr = new int[a.m_size];        memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size);        m_size = a.m_size;    }}

03析构函数

析构函数的目的是释放数组的资源,代码如下:

// 析构函数MyArray::~MyArray(){    // 如果指针地址不为空时,则释放资源    if(m_ptr)        delete [] m_ptr;}

04 重载分配=运算符函数

重载分配=运算符函数目的就是 = 号左边对象里存放的数组,大小和内容都和右边的对象一样,代码如下:

// 重载赋值 = 运算符函数MyArray & MyArray::operator=(const MyArray & a){    if(m_ptr == a.m_ptr) // 防止a=a这样的赋值导致出错        return *this;         if(a.m_ptr == NULL) // 如果a里面的数组是空的    {        if(m_ptr)            delete [] m_ptr; // 释放旧数组的资源                m_ptr = NULL;        m_size = 0;        return *this;    }        // 如果原有空间足够大,就不用分配新的空间    if(m_size < a.m_size)用分配新的空间    {        if(m_ptr)            delete [] m_ptr; // 释放旧数组的资源                    m_ptr = new int[a.m_size]; // 申请新的内存地址    }        // 拷贝内容    memcpy(m_ptr, a.m_ptr, sizeof(int)*a.m_size);    m_size = a.m_size;    return *this;}

05重载[]操作符功能

重载[]运算符功能的目的是通过[]运算符获取相应下标的数组值,代码如下:

// 重载[]运算符函数int & MyArray::operator[](int i){    return m_ptr[i]; // 返回对应下标的数组值}

06将元素添加到数组末尾的函数

push_back函数的目的是在数组的末尾添加一个新元素,代码如下:

// 在数组尾部添加一个元素void MyArray::push_back(int v){    if(m_ptr) // 如果数组不为空    {        // 重新分配空间        int *tmpPtr = new int[m_size + 1];                 // 拷贝原数组内容        memcpy(tmpPtr, m_ptr, sizeof(int)*m_size);                delect [] m_ptr;        m_ptr = tmpPtr;    }    else // 如果数组本来就是空的    {        m_ptr = new int[1];       }        m_ptr[m_size++] = v; //加入新的数组元素}

07获取数组长度的函数

长度函数相对简单。它直接返回成员变量m_size,即数组的长度。代码如下:

// 获取数组长度的函数int MyArray:;length(){    return m_size;}

— 04 —— 04 —

改进它?

push_back函数仍有优化的空间。每次添加元素时,当前的push_back函数都会重新分配新的内存,这会增加开销。

然后是优化思想:预先分配大小为n的空间,当数组大小不足时,然后继续重新分配2n大小的空间,依此类推。

我们需要添加两个成员变量:

 int  m_cout;   // 数组元素的个数 int  m_newNum; // 扩容的次数

改进的push_back函数,代码如下:

c4e459caacd6e4402c6bdb7bdae94b60.png


— 5 —— 5 —

概要

最后,总体代码如下:

7c3f6df5213e37cb02554246b047870a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推

写在前面在MySQL数据库中&#xff0c;索引对查询的速度有着至关重要的影响&#xff0c;理解索引也是进行数据库性能调优的起点&#xff0c;索引就是为了提高数据查询的效率。今天我们来聊聊在MySQL索引优化中两种常见的方式&#xff0c;索引覆盖和索引下推索引覆盖要了解索引覆…

循环斐波那契数列_第五课:斐波那契数列(第一课时)

简介&#xff1a;又称黄金分割数列、因数学家列昂纳多斐波那契以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、34……在数学上&#xff0c;斐波那契数列以如下被以递推的方法定义&#xff1a;F(…

命令行 蓝牙_Ubuntu使用BlueZ驱动蓝牙dongle

蓝牙dongle即蓝牙适配器&#xff0c;一般为USB接口&#xff0c;通过USB连接到PC等设备。连接dongle后&#xff0c;PC即可使用驱动程序控制dongle连接其它蓝牙设备。本文主要介绍在Ubuntu系统中安装BlueZ的方法及蓝牙的使用。01获取BlueZBlueZ是Linux系统的官方蓝牙协议栈&#…

Java在Windows下导出xml文件到Linux服务器上

最近由于公司项目需要&#xff0c;学习了在Windows平台导出xml文件到Linux服务器上的指定目录下的方法&#xff0c;&#xff08;注&#xff1a;这里的我的Linux是在本机上装的虚拟机&#xff09;现在写下来记录一下&#xff01; 1.首先是项目截图&#xff1a; 2.主要是类&…

java peek函数_Java 8 Stream Api 中的 peek 操作

1. 前言我在 Java 8 Stream API中的 map 和flatMap 中讲述了Java8 Stream API中 map 操作和 flatMap 操作的区别。然后有小伙伴告诉我 peek 操作 也能实现元素的处理。但是你知道 map 和 peek 的区别吗&#xff1f; map 我们在开头文章已经讲过了&#xff0c;你可以去详细了解一…

iphone如何查看dns延迟_iPhone手机网速慢?1分钟教你设置DNS,网速立马翻一番

很多小伙伴在购机时选择苹果手机都是因为iOS系统的流畅度和精简性&#xff0c;但iPhone在可玩性和信号方面是不如安卓手机的。大家在使用过程中一定遇到过这样的情况&#xff0c;连接同一个无线网&#xff0c;但是苹果的网速总是要比安卓慢&#xff0c;这该怎么办呢&#xff1f…

copying mysql status_mysql慢查询copying to tmp table

windows server&#xff0c;无论修改my.ini的tmp_table_size&#xff0c;max_heap_table_size到多少&#xff0c;情况都一样。同样的表和查询语句&#xff0c;在本地运行&#xff0c;没出现慢查询。SELECTg.goods_id,g.goods_name,g.shop_price,g.goods_thumb,SUM(og.goods_num…

JDK 7,jdk1.7 安装及配置

1.打开网页&#xff1a;http://www.oracle.com 下载对应平台的合适JDK。 2. 双击下载的exe,如jdk-7u7-windows-i586.exe。 3.进入安装向导&#xff1a; 4.下一步&#xff0c;更改安装路径&#xff0c;选择安装所有组件。 更改为D:\jdk1.7.0_07\ 点击确定 5.下一步&#xff0c;…

c mysql 编译_MySQL编译安装之cmake

mysql版本5.5以上编译安装时需要用到软件cmake&#xff0c;cmake特性是独立于源码编译&#xff0c;编译工作可以在另外一个目录中而非源码目录中进行&#xff0c;mysql版本5.5以上编译安装时需要用到软件cmake&#xff0c;cmake特性是独立于源码编译&#xff0c;编译工作可以在…

vb连接mysql未发现_vb连接MySQL遇到的问题解决方法

1.安装mysql,2.安装MyODBC-standard-3.51.07-win.msi3:vb连接语句是:Public strcnn As StringPublic sql As StringPublic conn A1.安装mysql,2.安装MyODBC-standard-3.51.07-win.msi3:vb连接语句是:Public strcnn As StringPublic sql As StringPublic conn As New ADODB.Conn…

mysql里面有没有map类型_MySQL学习(二) 数据类型

MySQL支持多种列类型&#xff1a;数值类型、日期/时间类型和字符串(字符)类型。数值类型数值类型又分为整数型与小数型整数型下面的表显示了需要的每个整数类型的存储和范围创建一张表mysql> CREATE TABLE t_int (int_1 TINYINT,int_2 SMALLINT,int_3 MEDIUMINT,int_4 INT,i…

shell执行perl_【编程技巧(一)】在Perl、Shell和Python中传参与输出帮助文档

社会你明哥&#xff0c;人狠话又多&#xff01;【小明的碎碎念】与你不见不散&#xff01;作为一名搞数据的生物狗&#xff0c;咱们是生物狗中代码写得最六的&#xff0c;程序员中生物学得最好的——大家没意见吧&#xff0c;有意见请憋着跟随小明的步伐&#xff0c;让我们开开…

python之路2.0_Python之路【第二十一篇】:JS基础

1.2 ECMAScript尽管 ECMAScript 是一个重要的标准&#xff0c;但它并不是 JavaScript 唯一的部分&#xff0c;当然&#xff0c;也不是唯一被标准化的部分。实际上&#xff0c;一个完整的 JavaScript 实现是由以下 3 个不同部分组成的&#xff1a;● 核心(ECMAScript)● 文档对象…

solr4 mysql自动更新_(solr系列:五) solr定时实时重建索引和增量更新

将mysql中的数据导入到了solr中之后&#xff0c;如果数据库中的数据有变动&#xff0c;solr中还是第一次导入的旧的数据&#xff0c;那该如何是好呢&#xff1f;该如何实现mysql数据库中的数据定时同步到solr中呢&#xff1f;下面将做详细的介绍。准备工作要做好&#xff1a;1、…

mysql pydev_pydev-python 链接mysql数据库(mac系统)

在mac os上安装MySQLdb&#xff0c;遇到了非常多问题&#xff0c;总结一下&#xff1a;首先。假设用sudo easy_install mysql-python命令安装&#xff0c;基本上不会成功的&#xff0c;原因有两个&#xff1a;一是找不到mysql_config位置&#xff0c;二是如今基本上安装的是64位…

上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...

一、选择题: 将唯一正确的选项写在题前括号中.每题2分.【】(1) 本课程的目标定位是什么?[A] 学习Python语言[B] 学习计算机的工作原理[C] 学习各种算法[D] 学习用计算机解决问题【】(2) 下列哪个标识符是合法的?[A] var-name [B] !#$% [C] _100 [D] elif【】(3) 执行下列语句…

mysql 安装测试ok_tpcc-mysql安装测试与使用的实例教程

1&#xff1a;下载tpcc-mysql的压缩包&#xff0c;从下面的网站进行下载也可直接从叶总博客直接下载&#xff1a;我这边使用的就是后者。2&#xff1a;安装tpcc-mysql[rootmxqmongodb2 tpccmysql]# gunzip tpcc-mysql-src.tgz[rootmxqmongodb2 tpccmysql]# tar xf tpcc-mysql-s…

python多线程写同一文件_Python多线程写文件实例

# -*- coding: utf-8 -*-import threading多线程生成日志工具__author ["yangfei" ]#该方法主要用于写入300行WARN日志def writeWarnLog(file):count0;while count<300:try:file.write(2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n)count1except Except…

java asc码_Java中ASC码与字符互相转化

package com.ljq.test;/*** Java中ASC码与字符互相转化** author jiqinlin**/public class ASCTest {private static int ascNum;private static char strChar;public static void main(String[] args) {System.out.println(getAsc("a"));System.out.println(backcha…

hp 导出日志 远程管理卡_惠普服务器远程管理卡安装详解

可以远程管理服务器。带惠普基于Web的网络资源管理和性能监视工具HP Toptools惠普远程管理卡的主要功能是可以实现对服务器的远程监控&#xff0c;其中包括察看日志、远程诊断、远程开/关机、重启等等。基于惠普远程管理卡的重要功能&#xff0c;本文将着重介绍惠普远程管理卡的…