C++数据结构之--ArrayList(数组实现list)详解

2023-11-07

什么是List

  List是一种常见的数据结构,用于存储一系列有序的元素。它允许存储、访问、添加、删除和修改元素,可以根据需要动态调整大小。

以下是List的一些常见特点和用途:

  • List中的元素按照它们被添加的顺序进行存储,并可以根据索引进行访问。
  • List可以包含任意类型的元素,如整数、字符串、自定义对象等。
  • List通常支持重复元素,即同一个元素可以出现多次。
  • List一般提供了丰富的内置方法,如添加元素、删除元素、获取元素、修改元素、查找元素、排序等。
  • List可以用于实现栈(Stack)和队列(Queue)等其他数据结构。(后续会讲栈(Stack)和队列(Queue))。
  • List还可以用于存储和处理大量数据,并提供高效的元素访问和操作。

实现

数据结构:

        T* data : 动态数组

        int siz:数组元素的个数

        int capacity:数组实际大小

实现功能:

        1、末尾添加元素:push(T t)

        2、指定位置添加元素:push(int index, T t)

        3、修改指定位置元素:set(int index, T t)

        4、获取指定位置的元素:get(int index)

        5、删除指定位置元素:remove(int index)

        6、扩容:expand_capacity()

        7、打印list:print_list()

C++代码

        方法声明及部分实现
/**
 * 数组实现list
 */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>

#ifndef LIST_ARRAY_LIST_H
#define LIST_ARRAY_LIST_H

const int EXPAND_CAPACITY = 50; // 每次扩容大小
const int MAX_CAPACITY = INT_MAX; // 最大容量

template<typename T>
class ArrayList {
public:

    /**数组末尾添加元素
     * @brief push
     * @param t
     */
    void push(T t) {
        expand_capacity();
        data[siz] = t;
        siz++;
    }

    // 指定位置添加元素
    void push(int index, T t);

    inline int size() const { return siz; } // 获取list大小

    // 获取指定位置的元素
    T get(int index) {
        if (index < siz && index > 0) return data[index];
    }

    // index位置元素设置为t
    T set(int index, T t) {
        if (index < siz && index > 0) {
            T old_v = data[index];
            data[index] = t;
            return old_v;
        }
    }

    T remove(int index);

    ArrayList() {
        data = (T *) malloc(sizeof(T) * capacity);
    }

    // 析构
    ~ArrayList() {
        delete data;
    }

    // 打印list
    void print_list(){
        for(int i = 0; i < siz; i++){
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }
private:
    T *data; // 数据
    int siz = 0; // 元素个数
    int capacity = 10; // 数组容量

    // 扩容
    void expand_capacity();
};

#endif //LIST_ARRAY_LIST_H
        核心实现
        扩容

        实现思路:当siz>=capacity时,给data扩容并重新分配内存。malloc函数分配内存,memcpy拷贝数组。

/**
 * 扩容
 * push操作时扩容
 * @tparam T
 */
template<typename T>
void ArrayList<T>::expand_capacity() {
    if (siz >= capacity) {
        capacity += EXPAND_CAPACITY;
        if (capacity >= MAX_CAPACITY) {
            capacity = MAX_CAPACITY;
        }
        T *t = (T *) malloc(sizeof(T) * capacity);
        memcpy(t, data, sizeof(T) * siz);
        delete data;
        data = t;
    }
}
        指定位置插入元素

        实现思路:先执行扩容操作,如果index大于等于siz直接从list最后添加元素。如果从中间插入,先把index后的元素后移,再在index位置插入t。siz ++

/**
 * 从index位置插入元素t
 * @tparam T
 * @param index
 * @param t
 */
template<typename T>
void ArrayList<T>::push(int index, T t) {
    expand_capacity();
    if (index >= siz) {
        push(t);
    } else {
        for (int i = siz - 1; i >= index; i--) {
            data[i + 1] = data[i];
        }
        data[index] = t;
        siz++;
    }
}
        删除指定位置的元素

        实现:直接把index后的所有元素前移一位,siz = siz -1


/**
 * 删除指定位置的元素
 * @tparam T
 * @param index
 * @return
 */
template<typename T>
T ArrayList<T>::remove(int index) {

    T res = data[index];

    for(int i = index; i < siz - 1; i++){
        data[i] = data[i+1];
    }
    siz --;
    return res;
}

测试

        代码

#include "array_list.h"

int main() {
    ArrayList<int> arrayList;
    arrayList.push(12); // 添加元素
    arrayList.push(1,23);
    arrayList.push(5,33);
    arrayList.push(1,102);
    arrayList.print_list();
    arrayList.remove(0); // 删除元素
    arrayList.print_list();

    arrayList.set(2,44);
    arrayList.print_list();

    std::cout << arrayList.get(2) << std::endl;
    return 0;
}

        输出

12 102 23 33 
102 23 33 
102 23 44 
44

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++数据结构之--ArrayList(数组实现list)详解 的相关文章

  • 使用 Html Agility Pack 获取 html 页面上的所有 div id

    如何使用 Html Agility Pack 获取 html 页面上的所有 div id 我正在尝试获取所有 id 并将它们放入一个集合中 p p div class myclass1 div div div div div div div
  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • StackExchange Redis 删除所有以以下开头的键

    我有一个格式的密钥 Error 1 Error 24 Error 32 Using StackExchange Redis 我该怎么办KeyDelete在与格式匹配的所有键上Error 在另一个答案中我看到了 LUA 脚本 EVAL ret
  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 我想找到 C# 代码中所有后面没有括号的 if 语句。通过正则表达式

    我想找到所有if声明和for后面没有大括号的语句 当你在一个文件中写入一行时if声明您大多不会将其括在大括号中 所以我想找到所有这些if and for声明 请帮忙 就像我想捕捉这个声明 if childNode Name B return
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • 结构大小与 typedef 版本不同?

    我的代码中有以下结构声明和 typedef struct blockHeaderStruct bool allocated unsigned int length typedef struct blockHeaderStruct block
  • Microsoft Visual Studio 2017 中的 wxWidgets 设置

    我花了大约 20 个小时试图弄清楚如何在 Microsoft Visual Studio 2017 中设置 wxWidgets 我遵循 https wiki wxwidgets org Microsoft Visual C 2B 2B Gu
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • C 中的等效 plpgsql 触发器

    我有一个 PostgreSQL 9 0 服务器 并且在某些表上使用继承 因此我必须通过如下触发器模拟外键 CREATE OR REPLACE FUNCTION othertable before update trigger RETURNS
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • 亲测——eclipse中windowBuilder插件的5种安装方式

    windowBuilder的安装方法 方法1 在Eclipse MarketPlace 插件市场中搜索在线安装 依次点击help Eclipse MarketPlace 在find中搜索 windowBuilder点击install安装即可
  • as3 java 交互_AS3与交互

    1 与Socket服务器建立连接 2 向Socket服务器发送数据 3 从Socket服务器读数据 4 同Socket服务器进行握手 并确定收到了什么样的数据和如何处理这些数据 5 与Socket服务器断开 或者当服务器想与你断开的时候发消
  • 漫步数理统计三十一——依分布收敛

    上篇博文我们介绍了依概率收敛的概念 利用着概念我们可以说统计量收敛到一个参数 而且在许多情况下即便不知道统计量的分布函数也能说明收敛 但是统计量有多接近估计量呢 本篇博文讲的收敛就回答了这个问题 定义1 textbf 23450 20041
  • 深圳地铁远期规划20条线路图首发

    深圳市城市轨道网络远期共规划了20条线路 总里程约748 5公里 含弹性发展线路约73 7公里 同时规划了5条城际线路 形成约146 2公里的城际线网 加上国家铁路 深圳市轨道交通总里程远景规划将达到1080公里 轨道规模和密度与东京等国际
  • git commit回退,lfs上传

    一 如何回退到之前的commit 1 查看之前的commit git log 选择一个commit 执行 git reset hard commit号 会清空当前目录下和仓库不一致的文件 回退commit但不删除代码 可以 git rese
  • 小程序调用接口报错,会返回 {“error“:600001,“errMsg“:“request:fail -102:net::ERR_CONNECTION_REFUSED“} 问题。

    error 600001 errMsg request fail 102 net ERR CONNECTION REFUSED 这个错误是网络连接被拒绝的错误 它通常表示无法建立与服务器的连接 这种问题可能有几个可能的原因 1 服务器故障
  • PyTorch 深度学习实践 第8讲

    第8讲 加载数据集 源代码 B站 刘二大人 传送门PyTorch深度学习实践 加载数据集 说明 1 DataSet 是抽象类 不能实例化对象 主要是用于构造我们的数据集 2 DataLoader 需要获取DataSet提供的索引 i 和le
  • python基础------时间戳、时间组、时间串、日期相互转化和日历以及练习

    1 时间组 时间戳 时间串相互转化 import time 时间戳 tt time time print tt 时间组 b time localtime tt print b 时间组转化为时间串 striftime asctime c ti
  • VS2015编译Boost1.64

    一 下载并解压 boost1 64 0 http www boost org users history version 1 64 0 html
  • 机器学习和传统编程的比较

    该文章 对机器学习和传统编程方法进行了比较 一个结论值得重视 ML just like AI is not a substitution but supplementation for traditional programming app
  • Linux网络编程:IO多路复用——poll

    服务器端代码 poll 对select技术的改进 include
  • 英语介词学习(基础)

    文章目录 前言 介词概念 常见介词 空间介词 时间介词 方式介词 原因介词 关于介词 数值介词 状态介词 排除介词 总结 前言 本文主要目的是为了辨析各类基础介词 为了更好的背诵一些短语介词 如有错误 欢迎指正 介词概念 介词用来表示前置词
  • JAVA基础编程练习题

    编写一个程序 输入两个整数 计算它们的和并输出结果 import java util Scanner public class Main public static void main String args Scanner input n
  • os.getcwd()以及os.walk()用法

    os getcwd 以及os walk 用法 os getcwd 获取当前代码文件所在路径 例如 os getcwd 输出 C Users 17843 Jyputer notebook file word转换pdf源代码 os walk 获
  • 使用java实现基础的家庭记账程序

    家庭记账程序 需求说明 具体操作 完整代码 总结 需求说明 1 该程序能够记录家庭的收入 支出 并能打印收支明细表 2 项目采用分级菜单的方式 主菜单如下 3 假设家庭起始的生活基本金为10000元 4 每次登记收入 菜单2 后 收入的金额
  • java种的 author,在Intellij中自动完成@author

    I m migrating from Eclipse to Intellij Idea One thing I couldn t figure out yet is autocompletion of the author JavaDoc
  • linux命令后缀-d和 都表示后台启动,Linux复习材料_关宇亮整理版.doc

    Linux复习材料 关宇亮整理版 Linux目录 第1章1 Linux的内核版与发行版的区别2 2个开发标准规范 4 常见的Linux发行版 5 Unix与Linux的关系与区别 6 Linux的特性与优缺点 7 Linux的安装与分区 分
  • “微众区块链”品牌正式发布

    4月27日下午 以 新机遇 新使命 新出发 为主题的微众区块链品牌全新发布会在深圳成功举行 会上 微众银行正式宣布推出 微众区块链 全新品牌 并提出了 构筑ESG可信基础设施 促进公平与可持续 的全新使命 致力于为ESG 环境 社会和公司治
  • Netty 系列之编解码器和 handler 的调用机制

    编码和解码的基本介绍 编写网络应用程序时 因为数据在网络中传输的都是二进制字节码数据 在发送数据时就需要编码 接收数据时就需要解码 codec 编解码器 的组成部分有两个 decoder 解码器 和 encoder 编码器 encoder
  • C++数据结构之--ArrayList(数组实现list)详解

    什么是List List是一种常见的数据结构 用于存储一系列有序的元素 它允许存储 访问 添加 删除和修改元素 可以根据需要动态调整大小 以下是List的一些常见特点和用途 List中的元素按照它们被添加的顺序进行存储 并可以根据索引进行访