C++中的数组、链表与哈希表

C++中的数组、链表与哈希表

数组

数组是一种数据结构,它存储的是一组相同类型的值。数组中每个元素的类型都是相同的,而且数组中的元素是按照一定的顺序排列的。C++中的数组是有序的,并且可以通过下标来访问数组中的元素。

数组的定义和初始化

在C++中定义数组的语法如下:

type arr_name[arr_size];

其中,type表示数组元素的类型,arr_name为数组名,arr_size表示数组的大小。例如:

int arr[5];

这样就定义了一个有5个整数元素的数组。

在定义数组时,也可以对其进行初始化。初始化可以在定义数组时进行,也可以在定义完成后再手动进行。例如:

int arr1[5] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3, 4, 5};
int arr3[5] = {1, 2};

第一种方式中,数组的大小为5且每个元素的值为{1, 2, 3, 4, 5}。第二种方式中,由于数组的大小被省略了,所以编译器会根据初始化列表中的元素数量来计算数组的大小,这里的大小也是5。第三种方式中,数组的大小为5,但是只有前两个元素为1和2,后面三个元素会被默认初始化为0。

数组的访问和修改

由于数组是有序的,可以通过下标访问数组中的元素,下标从0开始。例如:

int arr[5] = {1, 2, 3, 4, 5};
cout << arr[0] << endl; // 输出1
cout << arr[2] << endl; // 输出3

也可以通过下标修改数组中的元素。例如:

int arr[5] = {1, 2, 3, 4, 5};
arr[0] = 10;
cout << arr[0] << endl; // 输出10

链表

链表是一种常见的数据结构,在链表中,每个元素包含了对下一个元素的引用,因此链表中的元素是可以动态添加和删除的。链表中的元素称为节点,每个节点中包含了当前节点的值和指向下一个节点的指针。C++中的链表是由指针实现的。

链表的定义和访问

在C++中定义链表的语法如下:

class Node {
public:
    int val;
    Node* next;
    Node(int x) : val(x), next(NULL) {}
};

其中,每个节点包含了一个整数val和指向下一个节点的指针next。链表实际上是由若干个Node节点组成的。

在定义链表时,一般需要定义一个头节点,其next指针指向第一个节点。例如:

Node* head = new Node(0);
head->next = new Node(1);
head->next->next = new Node(2);

这样就定义了一个包含三个节点、值为{0, 1, 2}的链表。可以通过遍历链表来访问每个节点:

Node* p = head;
while (p != NULL) {
    cout << p->val << endl;
    p = p->next;
}
链表的插入和删除

链表可以动态添加和删除节点,因此其长度是可以动态变化的。在链表中插入一个节点时,需要将前一个节点的next指针指向新的节点,新的节点的next指针指向后面的节点。例如,在链表中插入一个元素3:

Node* new_node = new Node(3);
new_node->next = head->next->next;
head->next->next = new_node;

这样会将3插入到1和2的中间。

在链表中删除一个节点时,需要将前一个节点的next指针指向后一个节点。例如,删除元素2:

head->next->next = head->next->next->next;

这样会将2从链表中删除。

哈希表

哈希表是一种高效的数据结构,可以用来存储键-值对。哈希表是由若干个桶(bucket)组成的,每个桶中包含了一个键-值对的链表。哈希表的键被哈希函数映射为一个索引,这个索引指向了具体的某个桶。当需要查找某个键对应的值时,先将键通过哈希函数计算出索引,然后再在相应的桶中查找。如果哈希函数设计得好,就能保证对于不同的键,它们被哈希到不同的桶中,这样就能保证查找的效率。

哈希表的定义和初始化

C++中的unordered_map实现了哈希表的功能,其定义语法如下:

unordered_map<key_type, value_type> mp;

其中,key_type为键的类型,value_type为值的类型。可以通过以下方式初始化哈希表:

unordered_map<int, int> mp = {{1, 2}, {3, 4}, {5, 6}};

这样就创建了一个包含三个键值对的哈希表,其中键为{1, 3, 5},值为{2, 4, 6}。

哈希表的插入和删除

向哈希表中插入一个键-值对时,可以使用map的insert函数,例如:

mp.insert({7, 8});

这样就可以将键为7、值为8的键值对插入哈希表中。如果该键已经存在,则不会进行插入操作。

删除一个键-值对时,可以使用map的erase函数。例如:

mp.erase(3);

这样就可以将键为3的键值对从哈希表中删除。如果该键不存在,则不会进行删除操作。

示例说明

数组示例:

int arr[] = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i < 5; i++) {
    sum += arr[i];
}
cout << sum << endl; // 输出15

这个示例演示了如何遍历数组,求出数组中所有元素的和。

链表示例:

Node* head = new Node(0);
head->next = new Node(1);
head->next->next = new Node(2);
Node* p = head->next->next;
head->next->next = head->next->next->next;
delete p;

这个示例演示了如何在链表中删除一个节点。首先创建了一个链表,然后找到链表中的第三个节点,并删除它。

哈希表示例

unordered_map<string, string> mp;
mp.insert({"apple", "red"});
mp.insert({"banana", "yellow"});
mp.erase("apple");
mp.insert({"grape", "purple"});
cout << mp["banana"] << endl; // 输出yellow

这个示例演示了如何创建一个字符串到字符串的哈希表,并进行插入和删除操作。最后输出了键为"banana"的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的数组、链表与哈希表 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构之算法的时间复杂度

    关于C语言数据结构之算法的时间复杂度,需要先了解一些基本概念。 什么是时间复杂度 时间复杂度是算法的一种衡量标准,用于评估算法的执行效率。表示代码执行的时间和数据量之间的关系,通常用大O符号来表示,称为“大O记法”。 时间复杂度的分类 时间复杂度可分为以下几类: 常数阶:O(1) 对数阶:O(log n) 线性阶:O(n) 线性对数阶:O(n log n) …

    数据结构 2023年5月17日
    00
  • python数据结构学习之实现线性表的顺序

    下面我来详细讲解一下“python数据结构学习之实现线性表的顺序”的完整攻略。 一、线性表的概念介绍 线性表是最基本、最常用的一种数据结构。线性表是由同类型的数据元素构成有序序列的抽象,常用的线性表有顺序表和链表两种结构。 顺序表就是用一段连续的物理空间依次存储一组类型相同的数据元素,同时在存储空间中,逻辑上相邻的两个元素,物理位置也相邻。 二、实现顺序表的…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的基础概念和数据模型详解

    Java数据结构之图的基础概念和数据模型详解 简介 图是一种非常重要的数据结构,在计算机科学和实际应用中广泛使用。比如搜索引擎中的网页之间的链接关系就可以用图来表示和处理。在本文中,我们将详细讲解图的基础概念和数据模型。同时,我们将通过两个实例来进一步说明图的应用。 图的基础概念 什么是图 图是由若干个节点(顶点)和连接节点的边组成的一种数据结构。一个图可以…

    数据结构 2023年5月17日
    00
  • 【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

    上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https:…

    算法与数据结构 2023年4月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

    数据结构 2023年5月17日
    00
  • 举例讲解C语言程序中对二叉树数据结构的各种遍历方式

    那么我们先来介绍一下二叉树。 什么是二叉树? 二叉树是一种树状的数据结构,它的每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树节点的定义如下: typedef struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NUL…

    数据结构 2023年5月17日
    00
  • C++数据结构之AVL树的实现

    C++数据结构之AVL树的实现 什么是AVL树 AVL树是一种自平衡二叉查找树,也就是说它通过旋转操作来保持树的平衡。 在AVL树中,任何节点的两个子树高度差不超过1。如果高度差大于1,则需要通过旋转操作来调整树的平衡。 AVL树提供了比红黑树更快的插入和删除操作,但是在读取数据时红黑树更快。 AVL树的实现 结构体定义 我们可以先定义一个结构体来表示AVL…

    数据结构 2023年5月17日
    00
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部