C++数据结构:线性顺序表(数组)

news2024/11/26 9:42:09

文章目录

  • 前言
  • 一、vector简介
  • 二、泛型编程自定义数组结构
    • 1、定义类
    • 2、删除、读取元素和首尾指针
    • 3、修改元素、获取元素数量、和插入
  • 总结


前言

将一个线性表存储到计算机中,把线性表的结点按逻辑顺序依次存放到一组地址连续的存储单元里,用这种方法存储的线性表称为顺序表。C++中数组、vector、list就是典型的顺序表,其中list是以链表实现的,本文主要以仿写一个数组实现的顺序表,进而更深入了解顺序表。


提示:以下是本篇文章正文内容,下面案例可供参考

一、vector简介

vector是一种动态数组,它可以根据需要自动调整大小,存储连续的元素。vector的优点是可以快速地随机访问任意元素,而不需要遍历。缺点是在中间或开头插入或删除元素时,需要移动后面的元素,效率较低。

vector在计算机中的存储方式与普通数组类似,都是采用连续的内存空间来存放元素。但是,vector有一个特殊的成员变量capacity,表示vector分配的内存空间的大小。当vector的元素个数超过capacity时,vector会自动分配更大的内存空间,并将原来的元素复制到新的空间中,然后释放原来的空间。

在这里插入图片描述
上图很形象的表示了,数组在计算机中的存储方式。其中存储地址 b 表示了数组的起始内存地址,实际情况上它的值类似于 0x00000000000b,一般在存储 int 数据情况下每个 int整数占4个字节,那么第二个地址就是 b+4,所以 b+d 就是 0x00000000000f ,以此类推。实际上我们在使用数组时,变量所存储的即是内存块的起始 b 的地址,直接 cout 数组的变量名即可得到这个地址。用C++语言描述:这就是一个指针。

笔者只是为了更好的了解数组,没必要也不可能完整的实现 vector 的功能。以下仅实现插入、删除、size()、begin()、end()等方法的部分简单功能。

二、泛型编程自定义数组结构

这里采用了泛型编程的方法,使得代码更有通用性。简单来说就是这个 Arrary 类可以用于存储 int、char、或string、bool 等各种C++数据类型,和STL中的各种容器一样。

1、定义类

#include <iostream>

using namespace std;
template <typename T> class Array{
    private:
        static const int default_size = 64;
        T *elems;
        int max_size;
        int len;

    public:
        Array(int size=default_size){
            if(size){
                max_size = size;
                len = 0;
                elems = new T[max_size];
                for (int i=0; i<max_size; ++i)
                    elems[i] = (T)NULL;
            }
        }

        ~Array(){
            delete[] elems;
        }

这里只是为了学习,所以定义了最大元素数量为64个,vector是可以自动调整这个值的。私有域中定义了各个变量、和函数名。构造函数Array初始化各值、分配了最大的内存空间。并写了析构函数用以释放内存。

2、删除、读取元素和首尾指针

  • delete_elem()方法用于按下标删除元素、判断是否超界后直接将后面的元素前移就行了。因为用了元素数量为界。
  • get_elem() 方法用于按下标取元素值,实现逻辑与删除基本类似。
  • begins()、 ends() 简单的返回了首尾元素的地址,其也是可以用于迭代循环的。可以参考以下迭代循环用法:
    for (auto it=arr.begins();it!=arr.ends();it++) { cout << *it <<endl; }
bool delete_elem(int loca){
            if (loca >= len || loca < 0){
                 return false;
            }else{
                for (int i=loca; i<len; ++i){
                    elems[i] = elems[i+1];
                }
                len--;
                return true;
            }
        }

        T get_elem(int loca){
            if (loca >= len || loca < 0){
                return (T)NULL;
            }else{
                return elems[loca];
            }
        }

        T* begins(){
            return elems;
        }

        T* ends(){
            return elems + len;
        }

3、修改元素、获取元素数量、和插入

代码都相当的简单,逻辑也与其它几个函数基本一致。就不再单独介绍了,有兴趣的可以自己解读一下。

        bool change_elem(int loca, T newdata){
            if (loca >= len || loca <0){
                return false;
            }else{
                elems[loca] = newdata;
                return true;
            }
        }

        int get_len(){
            return len;
        }

        bool insert_elem(T data){
            int curr_index = len;
            if (len >= max_size){
                return false;
            }else{
                elems[curr_index] = data;
                len++;
                return true;
            }
        }
}

以上代码虽然没有什么实用性,但相信对于了解数组的数据结构还是有一定帮助的,代码均是经过测试的。使用cout << "begins is " << arr.begins() << endl;输出结果是:begins is 0x7fece55053e0 与预期一致。不要深究以上代码中的变量及函数名称,主要为了避免冲突才取这些奇怪名字的。


总结

数组实现顺序表是很简单的,因为各成员功能函数均很容易实现,只是给数组用类再包装一下,实现几个有用的方法而已。虽然它并没有多大的实用性,但有兴趣的看官也可以试试,还可以给它加上类似python的排序方法,C++ STL中algorithm排序的参数太多。

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

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

相关文章

nodejs+vue+elementui个人心情日志博客网站系统5ht83

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端vueelementui,博客管理系统模块 该模块是博客管理系统中的重要模块&#xff0c;它也是博客管理系统的主模块&#xff0c;该模块的…

从 WebKit 看浏览器内核架构

浏览器常见的浏览器内核有&#xff1a;Blink、WebKit、Gecko、Trident 等&#xff0c;目前 WebKit 内核占据了非常大的的市场&#xff0c;包括 Chrome、Safari、安卓浏览器等市面上的主流浏览器&#xff0c;都使用了 WebKit 内核。 从 WebKit 看浏览器内核架构 既然 WebKit 这么…

lwip的arp协议的意义和更新时机

ARP协议存在的目的 ARP&#xff08;Address Resolution Protocol&#xff09;协议是 TCP/IP 协议族中的一个协议&#xff0c;它的主要目的是将 IP 地址解析为 MAC&#xff08;Media Access Control&#xff09;地址&#xff0c;以便在局域网中进行通信。 具体而言&#xff0c…

## 如何顺序处理设备上报的数据

1. 引言 随着智能技术的发展&#xff0c;市场上出现了很多的智能设备&#xff0c;其具有连接网络的能力。用户可以实现远程控制&#xff0c;并且设备也可上报自己的状态&#xff0c;实现云端对设备的运行情况分析。在某些情况下需要保证设备上报状态的有序性&#xff0c;例如传…

Unity之ShaderGraph 节点介绍 Input输入节点

目录 Input&#xff08;输入&#xff09;  1、Basic&#xff08;基本&#xff09;   1) Boolean&#xff08;布尔&#xff09;   2) Color&#xff08;颜色&#xff09;   3) Constant&#xff08;常量&#xff09;   4) Integer&#xff08;整型&#xff09;   5)…

weblogic CVE-2023-21839 复现

影响版本 Weblogic 12.2.1.3.0 Weblogic 12.2.1.4.0 Weblogic 14.1.1.0.0 这里是用的docker下载的vulhub的CVE-2023-21839 靶机和攻击机都是192.168.85.131 docker 启动环境 ocker-compose up -d 然后看一下说明书 vim README.zh-cn.md 让你访问ip:7001/console 好&a…

chatgpt赋能python:PythonWoody:网站优化工具的首选

Python Woody: 网站优化工具的首选 在当今数字化时代&#xff0c;网站被认为是企业的门面。 然而&#xff0c;这只是建立网络存在的起点。 在许多情况下&#xff0c;优化网站并提高其排名对于企业的成功至关重要。 在这里&#xff0c;Python Woody成为了网站优化工具的首选。 …

LVGL-最新版本及其版本定义标准

lvgl的最新版本是9.0.0&#xff0c;处于开发分支中。 稳定版本是8.3.0. 建议一般开发使用稳定版8.3.0. .\lvgl.h定义了当前版本 /*************************** CURRENT VERSION OF LVGL ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINO…

《JavaEE》HTTPS

文章目录 HTTPS起源HTTPS对称加密非对称加密两者的区别 HTTPS的安全问题使用对称加密正常交互黑客入侵解决方案 非对称加密引入非对称加密后的流程 中间人攻击黑客的入侵方案加入后的流程解决方案黑客再次加注解决方案 ​&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1…

ChatGPT突然上线APP!iPhone可用、速度更快,GPT-4用量限制疑似取消

新建了一个网站 ChatGPT人工智能中文站 - ChatGPT人工智能中文站http://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT免费镜像站 OpenAIChatGPT正式推出iOS应用程序的官方公告突然发布。 立即在苹果商店的免费列表中排名第二&#xff0c;在效率列表中排名第一。 &am…

VScode+LaTeX 配置时遇到的一些问题

文章目录 VScodeLaTeX 配置时遇到的一些问题1. json 配置文件总览2. 使用 SumatraPDF 作为 pdf 阅读器时的双向跳转3. 选择使用 VScode 内置的 tab 打开 pdf 或者使用外部 SumatraPDF 打开4. 关于 LaTeX Workshop 插件的安装 VScodeLaTeX 配置时遇到的一些问题 1. json 配置文…

『MySQL 实战 45 讲』17 - 如何正确地显示随机消息?(随机抽取 3 个词)

如何正确地显示随机消息&#xff1f;&#xff08;随机抽取 3 个词&#xff09; 需求&#xff1a;从用户的英语单词表中&#xff0c;随机选择三个单词&#xff0c;创表和插入数据如下&#xff1a; # 建表 CREATE TABLE words (id INT(11) NOT NULL AUTO_INCREMENT,word VARCHA…

Chatgpt版本的opencv安装教程

文章目录 前言一、安装opencv方法一二、安装opencv方法二 前言 最近刚买了台RTX 3070的电脑&#xff0c;顺手刷了个ubuntu系统专门玩Carla&#xff0c;为了方便查资料&#xff0c;也顺手搭了浏览chatgpt的环境&#xff0c;用的clash&#xff0c;还挺好用的。然后刚好在看Carla…

(转载)MATLAB智能算法30个案例分析(4)——基于遗传算法的TSP算法

1 理论基础 TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题&#xff0c;即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长&#xff0c;到目前为止还未找到一个多项式时间的有效算法。 TSP问题可描述为&#xff1a;已知n个城市相互之间的距离&…

chatgpt赋能python:PythonUrwid:一个优秀的控制台UI工具

Python Urwid&#xff1a;一个优秀的控制台UI工具 在开发控制台应用程序时&#xff0c;通常需要一种轻而易举的方法来创建用户界面。Python Urwid是一个高效&#xff0c;可定制的控制台UI工具&#xff0c;它可以帮助你创建强大的用户界面&#xff0c;同时获取出色的响应时间。…

SpringCloudAlibaba:继解决登录问题之后,Sentinel持久化没有效果问题

说实话好麻烦&#xff0c;每次使用关于Nacos的时候&#xff0c;bootstrap.yaml中都得配置username和password。 我后悔了。。。 哪位大哥有好办法啊&#xff01;&#xff01;&#xff01; 因为之前开启登录鉴权&#xff0c;导致使用Nacos就得配username和password&#xff0c…

day2 - 使用OpenCV进行图像的读取与展示

本期将使用OpenCV对图像进行一些基本的了解和操作&#xff1a;主要包含图像的读取、展示和保存&#xff0c;以及查看图像的基本属性&#xff0c;让我们充分的了解图像&#xff0c;为后续图像处理做准备。 完成本期内容&#xff0c;你可以&#xff1a; 会使用OpenCV对图像进行读…

Redis常用命令详解

Redis 是Remote Dictionary Service 的简称&#xff1b;也是远程字典服务。它是内存数据库&#xff0c;KV 数据库&#xff0c;数据结构数据库。它是一个单线程的单reactor模型。其交互方式是请求响应方式。在正常情况下&#xff0c;如果向redis发出请求&#xff0c;则一定会有响…

MyBatis 框架

MyBatis 框架 MyBatis 简介搭建 MyBatis 开发环境核心配置文件详解mapper 映射文件&#xff08;实现增删改查&#xff09;MyBatis获取参数值的两种方式MyBatis的各种查询功能特殊SQL的执行自定义映射resultMapresultMap 字段和属性的映射多对一映射处理一对多映射处理 动态SQLM…