C++:数组、链表与哈希表

本文深入探讨C++中的数组、链表和哈希表。数组是一种存储相同类型元素的集合,可使用下标访问;链表由动态分配的节点构成,方便插入和删除;哈希表提供快速查找,利用哈希函数将键映射到位置。文章还介绍了LeetCode相关题目,如前缀和、差分数组和滑动窗口的应用。
摘要由CSDN通过智能技术生成


数组和链表

C++的数组和链表分别是什么?分别有什么种类?它们都有什么特性?针对这些特征,使用情形是什么?

数组

什么是数组?

一个数组就像是一个变量,它可以存储一组值,但是所有值都是相同的数据类型。

一个int数组定义:int hours [6]
该数组类型为int型,即存储元素是整数。
该数组的名称是hours,方括号内为数组的大小,它表示数组可以容纳的元素或值的数量,必须是一个常量整数,其值大于0.(也可以是命名常数)
初始化数组:int hours[6] = { 1, 2, 3, 4, 5, 6}.

访问数组元素

数组的元素可以根据下标作为单独的变量进行访问和使用,C++中的下标编号从0开始,数组中最后一个元素的下标比数组中元素的总数少1.
如果采用全局定义的方式定义一个包含数值的数组,则默认情况下,所有元素初始化为0.但是,如果定义的是局部变量,则没有默认的初始值。

上面hours数组的每个元素在被下标访问时都可以用做int变量赋值:hours[0] = 20

可变长的动态数组:vector

vector是顺序容器的一种,是可变长的动态数组。所以vector具备数组的性质:在vector容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况也是常数。
但是,在中间插入或删除元素,需要移动多个元素,速度较慢,平均花费时间和容器中的元素个数成正比。

Vector基本用法
成员函数 作用
vector() 无参构造函数,将容器初始化为空
vector(int n) 将容器初始化为有n个元素
vector(int n, const T &val) 假定元素类型为T,将容器初始化为有n个元素,每个元素的值都是val
vector(iterator first, iterator last) first,last可以是其他容器的迭代器。一般来说,本构造函数的初始化结果就是将vector容器的内容变成与其他容器上的区间[first,last)一致
void clear() 删除所有元素
bool empty() 判断容器是否为空
void pop_back() 删除容器末尾的元素
void push_back(const T &val) 将val添加到容器末尾
int size() 返回容器中元素的个数
T & front() 返回容器中第一个元素的引用
T & back() 返回容器中最后一个元素的引用
iterator insert(iterator i, const T &val) 将val插入迭代器i指向的位置,返回i
iterator insert(iterator i, iterator first, iterator last) 将其他容器上的区间[first,last)中的元素插入迭代器i指向的位置
iterator erase(iterator i) 删除迭代器i指向的元素,返回值是被删元素后面的元素的迭代器
iterator erase(iterator first, iterator last) 删除容器中的区间[first, last)
void swap(vector < T > &v) 将容器自身的内容和另一个同类型的容器v互换
#include <vector>
using namespace std;
int main(){
   
	int a[5] = {
   1, 2, 3, 4, 5}
	vector <int> v(a, a+5); //将数组a的内容放入v
	cout << v.end() - v.begin() << endl; //两个迭代器相减,输出:5
	v.insert(v.begin()+2, 13); // 在begin()+2 位置插入13, v变为:1,2,13,3,4,5
	v.eraser(v.begin()+2); // 删除位于begin()+2 位置上的元素,v变为:1,2,3,4,5
	vector <int> v2(4, 100); // v2有4个元素,都是100
	v2.insert(v2.begin(), v.begin() + 1,</
声明:使用这些类是使用者的自愿行为,作者对源代码的质量不提供任何形式的担保,如果使用者因使用这些类而造成的任何损失都与作者无关,作者不承担任何责任。<br><br>/*************** 这些头文件不必包含 ***************/<br>node.h: 普通链表结点<br>dnode.h: 双向循环链表结点<br>treenode.h: 二叉树结点<br>avltreenode.h: AVL 树结点<br>/**************************************************/<br><br>array.h: 安全数组,可自动增长大小(随机访问,但扩充时效率低)<br>linkedlist.h: 普通链表(可随机访问,但访问效率低)<br>dclinkedlist: 双向循环链表(不可随机访问,但插入、遍历的效率都比普通链表高)<br>hashtable.h: 哈希表(使用键值标识元素,键值一样的元素即认为相等,需重载 == 运算符并由用户定义哈希函数)<br>binstree.h: 二叉搜索树(需重载 == 和 < 运算符)<br>avltree.h: AVL 树(需重载 == 和 < 运算符)<br><br>如果要存储集合(元素不可重复)并快速查找,最佳的是 binstree.h(二叉搜索树)。<br>如果要存储二维或更高维的表格,最佳的是 hashtable.h(哈系表)。<br><br>AVL 树的插入成本非常高(删除函数也没有实现),但 AVL 的搜索效率极高,所以适用于在程序开始前初始化程序中经常要用到的集合,一般应用二叉搜索树已经足够了。<br><br>以上代码都是作者照书上改写的,并未经过严格测试,如果使用过程中发现任何问题、源代码错误或可改进的地方,非常欢迎来信与我讨论。电子邮件地址:pro_zw@lol35.com<br><br>作者会根据各位所发现的问题不断改进各类并增加新的数据结构,使其更加完善。<br><br>参考书目:<br>《数据结构-C++ 语言描述》 William Ford William Topp 著 清华大学出版社<br>《计算机程序设计艺术》 DONALD E.KNUTH 著 清华大学出版社<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值