c++数据结构:数组和向量

news/2024/4/27 12:26:06/文章来源:https://blog.csdn.net/qq_45303986/article/details/127225707

线性表:

在数据元素的非空有限集中

  • 存在唯一的一个被叫做“第一个”的数据元素
  • 存在唯一的一个被叫做“最后一个”的数据元素
  • 除第一个之外,集合中的每个数据元素均只有一个前驱
  • 除最后一个之外,每个集合元素均只有一个后继
  • 数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构
  • 线性表有:数组、队列、链表以及堆栈
  • 非线性表有: 二维数组,多维数组,广义表,树 (二叉树等),图

数组:

它可以存储一个固定大小的相同类型元素的顺序集合,是相同类型的,不可以扩展容量。

 

向量:

但其大小可以不预先指定,并且自动扩展。 它可以像数组一样 被操作,由于它的特性我们完全可以将vector 看作动态数组。(动态扩展:不是在原空间后添加新空间 而是找更大的空间 把数据拷贝到新的空间 释放原空间)

 

 矩阵:

 一般用二维数组来存储矩阵元

压缩存储:为多个值相同的元只分配一个存储空间;对零元不分配空间。 

  • 特殊矩阵 :有相同的元素或零元素在矩阵中的分布有一定的规律
  • 稀疏矩阵:与特殊矩阵相反

对称矩阵的压缩:(根据对角线对称)

 

 可以把对称矩阵压缩为一维数组:

  • 通过下三角压缩    K=i*(i-1)/2+j-1     i>=j
  • 通过上三角压缩    K=j*(j-1)/2+i-1     i<j

 三对角矩阵:主对角线上下两条对角线,其他皆为0

K=2+(i-2)*3-(i-j)+2 -1

K=2i+j-3

稀疏矩阵:(数据大多数都为0,当非0元素<=5%时为稀疏矩阵)

 稀疏矩阵的压缩方法:

  • 三元组
  • 十字链表

三元组:

((x,y),data),使用x,y来存储位置,data存储数据

 十字链表:

 当矩阵中的零元个数和位置在操作过程中变化较大时,使用十字链表。

十字链表的格式:

∧的作用:代表没有相关联的链域

∧的使用规则;

  1. 行列中的使用:如果该行或该列全为0,则使用∧
  2. 后继链域的使用:如果该位置的同行或同列后全为0,使用∧

 

数组的运用:

1.数组以列或行为主存放的区别:

  • 以列为主存取:按照列的方式存储
  • 以行为主存取:按照的方式存储

A[i,j] 每个元素的长度为3,i的范围为1-8   j的范围为1-10,首地址为G

计算A[5,8]的地址

红线位置表示地址的偏移量

  • 以列为主存取:((7*8+5)-1)*3=180
  • 以行为主存取:(4*10+8-1)*3=141

 

2.对a[0]的访问

char c[2][3] = { {'a','b','c'},{'1','\0','2'} };printf("%s", c[0]);

c[0]代表的是以c[0][0]为首地址的一维数组(将数组c摊开)

%s 到\0结束 

结果为:abc1

Vector的模板类:

(只是实现简单的功能,有些地方并未严格处理)

#define MAX_Capacity 100 //默认容量template<class T>
class Vector
{
public:Vector(int a = 0, int b = MAX_Capacity, T c = 0)//默认的构造函数{_elem = new T[_capacity=b];//开辟空间for (_size = 0; _size < a; _elem[_size++] = v);//初始化数据}~Vector(){delete[]_elem;//释放空间}
private:int _size;//规模int _capacity;//容量T* _elem;//数据
};

可以添加以下功能:

1.判空

template<class T>
bool Vector<T>::empty()//判空
{return !_size;
}

2.查看规模

template<class T>
int Vector<T>::size()//规模
{return _size;
}

3.扩容

template<class T>
void Vector<T>::expand()//扩容
{if (_size < _capacity) return;//规模小于容量,不需要扩容if (_capacity < MAX_Capacity) _capacity = Default_Capacity;//当容量小于默认容量时设为默认容量//这两个都不满足时扩容T* oldelem = _elem;//用一个新指针指向内容_elem = new T[_capacity <<= 1];//_elem的容量翻倍for (int i = 0; i <= _size; i++){_elem[i] = oldelem[i];}delete[] oldelem;//释放空间
}

4.缩容

template<class T>
void Vector<T>::shrink()//缩容
{if (_capacity < Default_Capacity << 1) return; //防止收缩后小于Default_Capacityif (_size << 2 > _capacity) return;//以1/4为边界T* oldelem = _elem;_emem = new[_capacity >>= 1];//容量减半for (int i = 0; i < size; i++){_elem[i] = oldelem[i];}delete[] oldelem;//释放原空间
}

5.重载下表操作符

template<class T>
T& Vector<T>::operator[](int a)const
{return _elem[a];
}

6.复制区间A[a.b]

template<class T>
void Vector<T>::copyFrom(T const *A,int a,int b)//复制区间
{_elem = new T[_capacity = (b - a) << 1];//开辟区间两倍容量_size = 0;//复制,把规模置0while (a < b)//复制区间[a,b){_elem[_size++] = A[a++];}
}

7.重载=

template<class T>
Vector<T>& Vector<T>::operator=(Vector<T>const&A)//重载[]
{if (_elem)delete[] _elem;//_elem有内容的话就释放内容copyFrom(A._elem, 0, A.size());//整体复制return *this;
}

7.删除

template<class T>
void Vector<T>::remove(int t)//删除位置为t的数据
{if (t<0 || t>=_size) return;//如果t不符合范围,则返回0for (int i = t; i < _size; i++){_elem[i] = _elem[i + 1];}--_size;
}

8.删除一个区间

template<class T>
int Vector<T>::remove(int a,int b)//删除一个区间
{if (a == b)return 0;while (a < b){_elem[a++] = _elem[b++];}_size = _size - (b - a);shrink();//是否要扩容return b - a;
}

9.插入元素

template<class T>
void Vector<T>::insert(int a,T const& b)//插入一个数据
{expand();//是否需要扩容if (int i = _size; i > r; i--){_elem[i] = elem[i - 1];}_elem[a] = b;
}

10.对区间排序

template<class T>
void Vector<T>::sort(int a,int b)//对区间排序
{for(int i = a; i < b- 1; i++){for (int j = a; j < b- i - 1; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

11.对整体排序

template<class T>
void Vector<T>::sort()//对整体排序
{sort(0, size());
}

11.置乱器

template<class T>
void Vector<T>::permute()//对整体排序
{for (int i = _size; i > 0; i--){swap(elem[i-1],V[rand()%i])//v[i-1]与[0,i)中的某一个元素交换}
}

12.查找

template<class T>
void Vector<T>::search(T const& g,int a,int b)//查找
{while (a < b){int mi = (a + b) >> 1;(e < _elem[mi]) ? b = a : a = mi + 1;}return --a;
}

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

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

相关文章

文字识别检测入门(1)

CTPN 优点&#xff1a;对水平文字检测效果超级好 缺点&#xff1a;对扭曲的文字不好 RRPN 在faster的基础上改进 RPN改为RRPN ROI pooling改进为RROI pooling 能解决旋转&#xff0c;但是解决不了弯曲的曲面问题 EAST Anchor free 特征合并&#xff0c;检测不同尺度文本 检测各…

刷爆leetcode第三期 0007~0010

刷爆leetcode第三期 0007~0010 题目一 反转链表解法一解法二题目二 链表的中间节点题目三 链表的倒数第K个节点题目四 合并两个有序链表题目一 反转链表 解法一 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a…

python与人工智能:线性回归和逻辑回归

线性回归 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法&#xff0c;运用 十分广泛。梯度下降&#xff1f; 梯度下降法的基本思想可以类比为一个下山的过程。 假设这样一个场景&#xff1a;一个人被困在山上&a…

零拷贝总结

数据交互模式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqLJVb5U-1665401648551)(en-resource://database/1074:1)] 读数据过程&#xff1a; 应用程序要读取磁盘数据&#xff0c;调用 read()函数从而实现用户态切换内核态&#xff0c;这是第 …

论文/机器学习笔记:SENet (Squeeze-and-Excitation Networks)

Image 2017 挑战赛夺冠paper 1 motivation 希望显式地建模特征通道&#xff08;channel&#xff09;之间的相互依赖关系 通过学习的方式来自动获取到每个特征通道的重要程度依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征 2 模型 给定一个输入 x&#xff…

利用phpstudy导入mysql文件

1.创建mysql文件 mysql 常用命令&#xff1a; 打开mysql: mysql -u root -p 查看数据库&#xff1a; show databases; 创建 数据库: create database baseName (数据库名称) 使用数据库&#xff1a; use baseName(数据库名称) 显示表&#xff1a;show tables; 创建表&#xff…

C#【高级篇】 IntPtr是什么?怎么用?

C#学习汇总 - 总目录 C#【高级篇】 IntPtr是什么&#xff1f;怎么用&#xff1f;前言一、IntPtr&#xff08;IntPointer&#xff09;的由来二、IntPtr&#xff08;属于结构体&#xff09;的说明三、IntPtr的使用示例1、int类型与IntPtr类型之间的转换2、string类型与IntPtr之间…

Java collection集合的体系特点

Java collection集合的体系特点 集合类体系结构 collection单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Map双列集合&#xff0c;每个元素包含两个值&#xff08;键值对&#xff09;。 collection集合体系&#xff08;常见&#xff09; colle…

位段是什么玩意?你听说过吗??

当我们学完结构体之后&#xff0c;我们就要好好学学结构体实现位段的能力&#xff01;&#xff01;&#xff01; 目录 一、位段是什么&#xff1f; 二、位段的内存分配 三、位段的跨平台问题 总结 一、位段是什么&#xff1f; 位段的声明和结构体大体相同&#xff0c;但是有两…

【Unity_AssetBundle】(二)AB包资源打包、Asset Bundle Browser工具的使用

1.Asset Bundle Browser包安装 Asset Bundle Browser是AB包打包工具较底版本Unity编辑器&#xff1a; Windows——>Package Mannger——>搜索Asset Bundle Browser进行下载导入即可 较高版本Unity编辑器&#xff1a; 高版本Unity在Addressables功能中封装了AB包功能 安…

Telnet、DHCP、静态路由、等价路由、环回接口、浮动静态路由详解

文章目录前言一、Telnet二、DHCP----动态主机配置协议手工配置缺陷报文类型DHCP租期地址池DHCP中继代理路由信息来源直连路由静态路由优先级数据流量是双向的静态路由的扩展配置等价路由环回接口手工汇总路由黑洞缺省路由空接口路由浮动静态路由前言 一、Telnet Telnet是位于…

【数据结构】 归并排序、 基数排序

目录 一、什么是归并排序&#xff1f; 二、归并排序 三、什么是基数排序&#xff1f; 四、基数排序 五、各种排序的比较 一、什么是归并排序&#xff1f; 归并排序是建立在归并操作上的一种有效&#xff0c;稳定的排序算法。是将已有序的子序列合并&#xff0c;得到完全有…

09-Pawn类 UE4 C++

1.首先创建一个C的Pawn类 右键点击Public&#xff0c;选择新建C类 选择Pawn&#xff0c;然后点击下一步 命名后&#xff0c;点击创建 创建完毕&#xff0c;双击打开MyPawn 2.在MyPawn.h中添加如下代码&#xff1a; UPROPERTY(EditAnywhere) class UStaticMeshComponent* Mes…

SpringCloud-31-Spring Cloud Config微服务与配置文件解耦

11.8 微服务与配置文件解耦 我们可以将之前的子模块中的配置提取出来&#xff0c;托管到gitee上统一管理&#xff0c;这样运维人员维护配置文件就不变动子模块了&#xff0c;实现了模块与配置的解耦。 下面用例子来解释下这种做法的好处 在基础工程spring-cloud-microservice…

热血江湖服务端架设开服搭建教程

热血江湖服务端架设开服搭建教程 玩网游比较多的小伙伴&#xff0c;相信对热血江湖这款游戏也不陌生&#xff0c;摆脱了传统武侠游戏阴暗血腥的游戏风格&#xff0c;提倡一种“明朗而愉快的武侠”精神。画面上即不会太随意又不会过于沉重&#xff0c;画面干净清新。活泼可爱的…

ORACLE新增数据库(用户),使用navicate

oracle新增数据库并不像mysql直接指令就行&#xff0c;百度一圈都是用Oracle Database Configuration Assistant的&#xff0c;其实navicate就直接可以新建&#xff0c;以下是新建方法&#xff1a; 1.连接数据库 2.新建表空间 点击navicate上方工具栏中"其它"&…

何为功能平价?特斯拉「抛弃」多传感融合,背后有哪些门道

技术与成本&#xff0c;永远是博弈的两方。 当大部分车企都在寻求通过增加更多、更高性能的传感器&#xff08;也就是通常所说的多传感融合技术&#xff09;来强化智能驾驶功能可靠性和拓展性的大背景下&#xff0c;特斯拉依然我行我素&#xff0c;继续沿着纯视觉感知的路线前…

盘点一个Python列表(元素多样)处理的实战题目(使用正则表达式也可以实现)

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【凡人不烦人】问了一个Python列表处理的问题,提问截图如下:下面是他的部分数据: lst = [(问答题)(2) 假设镀锌钢管, http://admintk.sc.zzstep.com/UpLoadImage/2019-10-10/a84f340e-6c67-42b1-8eae-3dc14281…

队列的操作实验(数据结构)

队列的操作实验&#xff08;数据结构&#xff09; 一、实验目的 1&#xff0e;掌握队列存储结构的表示和实现方法。 2&#xff0e;掌握队列的入队和出队等基本操作的算法实现。 3&#xff0e;了解队列在解决实际问题中的简单应用。 二、实验内容 1&#xff0e;建立顺序循环队列…

【LeetCode】【二叉搜索树迭代器】

173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指…