【数据结构(邓俊辉)学习笔记】向量01——接口与实现

文章目录

  • 0.意图
  • 1、概述
  • 2 从数组到向量
  • 3 向量ADT接口
  • 4 Vector 模板类
  • 5 构造与析构
    • 5.1默认构造方法
    • 5.2基于复制的构造方法
    • 5.3 析构方法

0.意图

一方面是将工作学习中零星的知识点串起来,另一方面向量是其他数据类型的基础,比如栈队列等,所以基础知识打捞。

1、概述

介绍vector向量的接口与实现

2 从数组到向量

在这里插入图片描述

理解:
抽象与泛化:按照面向对象思想中的数据抽象原则,可对以上的数组结构做一般性推广,使得其以上特性更具普遍性。
管理维护更加简化:内存缩放均由内部判断。
元素类型可灵活选取,便于定制复杂数据结构:不再限定同一向量中的各元素都属于同一基本类型,它们本身可以是来自于更具一般性的某一类的对象。另外,各元素也不见得同时具有某一数值属性,故而并不保证它们之间能够相互比较大小。

3 向量ADT接口

在这里插入图片描述

这些为基础操作接口,后续扩充接口多为扩展和变形。所以了解清楚基础接口非常重要。

4 Vector 模板类

在这里插入图片描述
以上向量操作接口,可能有多种具体的实现方式,计算复杂度也不尽相同。

using Rank = unsigned int; //秩
#define DEFAULT_CAPACITY  3 //默认的初始容量(实际应用中可设置为更大)template <typename T> class Vector { //向量模板类
protected:Rank _size; Rank _capacity;  T* _elem; //规模、容量、数据区void copyFrom ( T const* A, Rank lo, Rank hi ); //复制数组区间A[lo, hi)void expand(); //空间不足时扩容void shrink(); //装填因子过小时压缩bool bubble ( Rank lo, Rank hi ); //扫描交换void bubbleSort ( Rank lo, Rank hi ); //起泡排序算法Rank maxItem ( Rank lo, Rank hi ); //选取最大元素void selectionSort ( Rank lo, Rank hi ); //选择排序算法void merge ( Rank lo, Rank mi, Rank hi ); //归并算法void mergeSort ( Rank lo, Rank hi ); //归并排序算法void heapSort ( Rank lo, Rank hi ); //堆排序(稍后结合完全堆讲解)Rank partition ( Rank lo, Rank hi ); //轴点构造算法void quickSort ( Rank lo, Rank hi ); //快速排序算法void shellSort ( Rank lo, Rank hi ); //希尔排序算法
public:
// 构造函数Vector ( Rank c = DEFAULT_CAPACITY, Rank s = 0, T v = 0 ) //容量为c、规模为s、所有元素初始为v{ _elem = new T[_capacity = c]; for ( _size = 0; _size < s; _elem[_size++] = v ); } //s<=cVector ( T const* A, Rank n ) { copyFrom ( A, 0, n ); } //数组整体复制Vector ( T const* A, Rank lo, Rank hi ) { copyFrom ( A, lo, hi ); } //区间Vector ( Vector<T> const& V ) { copyFrom ( V._elem, 0, V._size ); } //向量整体复制Vector ( Vector<T> const& V, Rank lo, Rank hi ) { copyFrom ( V._elem, lo, hi ); } //区间
// 析构函数~Vector() { delete [] _elem; } //释放内部空间
// 只读访问接口Rank size() const { return _size; } //规模bool empty() const { return !_size; } //判空Rank find ( T const& e ) const { return find ( e, 0, _size ); } //无序向量整体查找Rank find ( T const& e, Rank lo, Rank hi ) const; //无序向量区间查找Rank search ( T const& e ) const //有序向量整体查找{ return ( 0 >= _size ) ? -1 : search ( e, 0, _size ); }Rank search ( T const& e, Rank lo, Rank hi ) const; //有序向量区间查找
// 可写访问接口T& operator[] ( Rank r ); //重载下标操作符,可以类似于数组形式引用各元素const T& operator[] ( Rank r ) const; //仅限于做右值的重载版本Vector<T> & operator= ( Vector<T> const& ); //重载赋值操作符,以便直接克隆向量T remove ( Rank r ); //删除秩为r的元素Rank remove ( Rank lo, Rank hi ); //删除秩在区间[lo, hi)之内的元素Rank insert ( Rank r, T const& e ); //插入元素Rank insert ( T const& e ) { return insert ( _size, e ); } //默认作为末元素插入void sort ( Rank lo, Rank hi ); //对[lo, hi)排序void sort() { sort ( 0, _size ); } //整体排序void unsort ( Rank lo, Rank hi ); //对[lo, hi)置乱void unsort() { unsort ( 0, _size ); } //整体置乱Rank dedup(); //无序去重Rank uniquify(); //有序去重
// 遍历void traverse ( void (* ) ( T& ) ); //遍历(使用函数指针,只读或局部性修改)template <typename VST> void traverse ( VST& ); //遍历(使用函数对象,可全局性修改)
}; //Vector

通过模板参数T,指定向量元素的类型。使其可以存放各种数据类型,更加通用。
Vector类中包含基本接口外的其他接口,判空接口empty(),区间删除接口 remove ( lo, hi ),有序向量接口sort()多为基础接口的扩展和变形。

5 构造与析构

向量对象的构造与析构,将主要围绕私有变量量_capacity、_size和数据区_elem[]的初始化与销毁展开。
向量中秩为r的元素,对应于内部数组中的_elem[r],其物理地址为_elem + r
在这里插入图片描述

5.1默认构造方法

根据初始容量向系统申请空间,创建数组_elem[];若容量未明确指定,则使用默认值DEFAULT_CAPACITY。规模的变量_size初始化为0。

 Vector ( Rank c = DEFAULT_CAPACITY, Rank s = 0, T v = 0 ) //容量为c、规模为s、所有元素初始为v{ _elem = new T[_capacity = c]; for ( _size = 0; _size < s; _elem[_size++] = v ); } //s<=c

5.2基于复制的构造方法

以某个已有的向量或数组为蓝本,进行(局部或整体的)克隆
在这里插入图片描述
复制构造接口如下

 Vector ( T const* A, Rank n ) { copyFrom ( A, 0, n ); } //数组整体复制Vector ( T const* A, Rank lo, Rank hi ) { copyFrom ( A, lo, hi ); } //区间Vector ( Vector<T> const& V ) { copyFrom ( V._elem, 0, V._size ); } //向量整体复制Vector ( Vector<T> const& V, Rank lo, Rank hi ) { copyFrom ( V._elem, lo, hi ); } //区间

公用的基础接口为copyFrom()方法,接口与实现

template <typename T> //T为基本类型,或已重载赋值操作符'='
void Vector<T>::copyFrom ( T const* A, Rank lo, Rank hi ) { //以数组区间A[lo, hi)为蓝本复制向量_elem = new T[ _capacity = max<Rank>( DEFAULT_CAPACITY, 2 * ( hi - lo ) ) ]; //分配空间for ( _size = 0; lo < hi; _size++, lo++ ) //A[lo, hi)内的元素逐一_elem[ _size ] = A[ lo ]; //复制至_elem[0, hi - lo)
} //用const修饰,保证A中的元素不致被篡改;运行时间 = O(hi-lo)

copyFrom()首先根据待复制区间的边界,换算出新向量的初始规模;再以双倍的容量,为内部数组_elem[]申请空间。最后通过一趟迭代,完成区间A[lo, hi)内各元素的顺次复制。
若忽略开辟新空间所需的时间,运行时间应正比于区间宽度,即O(hi - lo) = O(_size)。
默认的运算符"="不足以支持向量之间的直接赋值,重载向量的赋值运算符。

5.3 析构方法

同一对象只能有一个析构函数,不得重载。

只需释放用于存放元素的内部数组_elem[],将其占用的空间交还操作系统。

~Vector() { delete [] _elem; } //释放内部空间

_size和 _capacity的内部变量无需做任何处理,他们将作为向量对象的一部分被系统收回,此后及无需也无法被引用。
若不计系统用于空间回收的时间,整个析构过程只需O(1)。

若向量中的元素是指向动态分配对象的指针或引用,故在向量析构之前应该提前释放对应的空间。
工作中经验来看,autosar c++中要求使用智能指针,好处一是内存占用小,二是当引用计数为0时,可以自动释放。

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

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

相关文章

Ubuntu 自己写的程序如何创建快捷方式

在Ubuntu中创建程序的快捷方式通常是通过将一个指向程序可执行文件的.desktop文件放入/usr/share/applications/或用户的~/.local/share/applications/目录来实现的。以下是创建快捷方式的基本步骤和示例&#xff1a; 创建一个新的.desktop文件。 在文件中填写必要的信息&…

【深度学习】yolo-World,数据标注,zeroshot,目标检测

仓库&#xff1a;https://github.com/AILab-CVC/YOLO-World 下载权重&#xff1a; 仓库下载和环境设置 下载仓库&#xff1a;使用以下命令从 GitHub 上克隆仓库&#xff1a; git clone --recursive https://github.com/AILab-CVC/YOLO-World.git创建并激活环境&#xff1a…

微软Azure AI服务中的Speech Studio:实现自动语音识别ASR与高效AI字幕生成

一、自动语音识别&#xff08;ASR&#xff09;和Speech是什么&#xff1f; 小爱同学、 Siri 、豆包的电话功能、微信的”文字语音转文字”&#xff0c;百度网盘的AI字幕&#xff0c;小度智能音箱、小米SU7等智能汽车的语音控制的功能都用到自动语音识别ASR&#xff0c;相当于A…

# MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

虚拟化+Docker基本管理

一、虚拟化简介 1、云端 华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、移动云、天翼云、西部数码云等 1.国内云 华为云、阿里云、腾讯云、天翼云(私有云) 2.国外云 谷歌云、亚马逊 2、云计算的服务模式是分层的 IaaS&#xff1a;Infrastructure&#xff08;基础设…

VUE3发布到IIS跳转页面报404以及刷新报404解决

1、安装URL重写&#xff0c;自行百度。 2、名称随意&#xff0c;匹配URL里左侧的与模式匹配我没有动&#xff0c;右侧我用的通配符&#xff0c;网上有的用的正则。模式我用的*&#xff0c;网上有人用的.* 3、条件要自己展开&#xff0c;一开始没有左侧框里的那2条&#xff0c;…

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

上海市中小学生的初中生古诗文大会——即上海中学生古诗文大会&#xff08;初中组&#xff09;和小学生古诗文大会&#xff08;比赛&#xff09;相比&#xff0c;除了题型更丰富之外&#xff0c;最主要的是考察的内容深度和广度不同。初中的题目中对于文言文的考察大幅增加&…

高中数学:三角函数之考点精华-单调性问题

一、解题方法 1、换元 2、画图 3、反向求解 参考&#xff1a;整体换元法 二、练习 例题1 解析&#xff1a; 这一题&#xff0c;比较简单&#xff0c;是标准的换元法应用题。 这里稍微注意下第二小问的对称中心&#xff0c;因为&#xff0c;B1&#xff0c;所以&#xff0c;对…

山海鲸大屏:驱动医药零售智能化变革

在数字化浪潮席卷全球的今天&#xff0c;医药零售行业也正以前所未有的速度与力度进行智能化转型。其中&#xff0c;山海鲸智慧医药零售大屏以其创新的设计理念、强大的功能集成与卓越的数据处理能力&#xff0c;成为推动医药零售迈向智能化、精准化的新引擎。本文将全方位解读…

呵护明亮视界:儿童戴眼镜的正确姿势与注意事项

引言&#xff1a; 随着近视率的不断上升&#xff0c;越来越多的儿童需要佩戴眼镜来矫正视力问题。然而&#xff0c;儿童的视觉系统尚未完全发育成熟&#xff0c;因此他们佩戴眼镜时需要特别的关注和呵护。本文将探讨儿童戴眼镜的正确姿势与注意事项&#xff0c;旨在为家长和孩子…

SQLite FTS5 扩展(三十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite的知名用户(二十九) 下一篇:SQLite 的命令行 Shell(三十一&#xff09; 1. FTS5概述 FTS5 是一个 SQLite 虚拟表模块&#xff0c;它为数据库应用程序提供全文搜索功能。在最基本的形式中&#xff0c; 全文搜索引擎允许…

ubuntu22.04 CH340/CH34x 驱动安装

CH34x驱动地址&#xff1a;CH341SER_LINUX.ZIP - 南京沁恒微电子股份有限公司 1、卸载旧驱动&#xff08;如果存在&#xff09; sudo rmmod ch341.ko 2、解压进入 driver 目录 unzip CH341SER_LINUX.ZIP cd CH341SER_LINUX/driver 3、编译 make 可能错误&#xff1a; make[1]…