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日

相关文章

  • 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 | 位运算 | 前缀和

    DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.eriktse.com…

    算法与数据结构 2023年4月20日
    00
  • AtCoder Beginner Contest 300

    A – N-choice question (abc300 a) 题目大意 给定一个元素互不相同的数组\(c\)和 \(a,b\),找到 \(i\)使得 \(c_i = a + b\) 解题思路 直接for循环寻找即可。 神奇的代码 #include <bits/stdc++.h> using namespace std; using LL = …

    算法与数据结构 2023年4月30日
    00
  • Python数据结构之顺序表的实现代码示例

    针对“Python数据结构之顺序表的实现代码示例”,我可以给出以下完整攻略: 什么是顺序表 顺序表是一种线性结构,是用一维数组来存储数据元素的有序集合。它支持随机访问,可以对任意位置的元素进行查找、插入、删除等操作。 顺序表的实现代码示例 以下是Python中实现顺序表的示例代码,以及相关的操作函数,包括创建空表、获取表长度、查找元素、插入元素、删除元素等。…

    数据结构 2023年5月17日
    00
  • C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配 什么是字符串的模式匹配? 字符串的模式匹配是指在一个主字符串中查找特定的子串,找到特定的子串后输出其在主字符串中的位置。 例如有一个主串”this is a test string”,要查找的子串为”string”,则字符串的模式匹配应能输出”string”在主串中的位置为17。 如何实现字符串的模式匹配? 字符串的模式匹配可以…

    数据结构 2023年5月17日
    00
  • 斜率优化入门

    前言 斜率优化是一种经典的单调队列优化类型,虽然它的名字很高大上,但是其思想内核非常简单,这篇博客就是用来帮助各位快速入门的 提示:本博客以单调队列的思想理解斜率优化 引入 dp 优化可以怎么分类? 数据结构维护决策点集的插入与查找 算法维护决策点集大小,取出无用决策点 而斜率优化 dp 属于第二者,且常常用于优化序列分割问题 Q1 P3195 A1 先列出…

    算法与数据结构 2023年4月17日
    00
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解 什么是Stack? Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。 在编程中,Stack也是一种非常常见的数据结构,特别是在函…

    数据结构 2023年5月17日
    00
  • qqwry.dat的数据结构图文解释第1/2页

    “qqwry.dat的数据结构图文解释第1/2页”的完整攻略 1. 什么是qqwry.dat? qqwry.dat是一个IP地址库,包含了全球的IP地址信息,例如:所属国家、所属地区、详细地址等信息。在大多数系统或应用程序中,都可以使用qqwry.dat来查询IP地址信息。 2. qqwry.dat的数据结构 qqwry.dat的数据结构可以通过两个文件来描…

    数据结构 2023年5月16日
    00
  • Java矢量队列Vector使用示例

    Java矢量队列Vector使用示例 Java中的Vector是一个可调整大小的数组实现,与ArrayList类似,但是可以支持同步。在需要线程安全时,可以使用Vector代替ArrayList。 Vector的创建 使用Vector需要先导入Java.util.Vector类,然后可以使用以下代码创建一个Vector: Vector<Object&g…

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