游戏开发常用数据结构与算法浅析《从C语言过渡到C++和虚幻引擎中的C++编程》教程⑨

前言

本文简单介绍下游戏开发中常用的最基础的数据结构与算法,内容较为浅显,不涉及数据结构与算法竞赛需要的复杂内容,仅仅介绍下基础概念,当目录吧。

数组

数组的概念

数组(Array)是有序的元素序列。 [1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 [1] 这些有序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。——百度百科

C++中的数组

相信大家对数组这个东西肯定不陌生,在C语言中,我们可以提供这种方式创建一个int类型的数组:

int a[5]={
    
    1,2,3,4,5};

这种最原始的数组一旦被定义后,其长度就不再可以变化,在实际开发中我们还需要可变长数组,C++提供了vector容器,定义在头文件vector中,让我们可以使用可变长的数组。
用例如下:

#include<vector>
#include <iostream>
using namespace std;
int main()
{
    
    
	vector<int> a = {
    
     1,2,3,4,5 };
	for (int i = 6; i < 10; ++i)
	{
    
    
		a.push_back(i);//使用push_back()添加元素
	}
	for (int i = 0; i < a.size(); ++i)//size()获取数组长度
	{
    
    
		cout << a[i] << endl;
	}
}

输出样例:

1
2
3
4
5
6
7
8
9

关于vector的更多使用方法,请务必看C++ vector 容器浅析

虚幻引擎中的数组

在虚幻引擎中又封装出了一种更高级的数组,在虚幻引擎中进行开发时,可以使用它,它比vector具有的功能更多。
怎么使用请看虚幻官方文档:
虚幻引擎中的TArray

链表

链表的概念

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。——百度百科

C++中的链表

推荐教程导航:
C++链表及其创建

链表在游戏开发中的一些应用

C语言贪吃蛇(详解)——链表实现

栈的概念

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。——百度百科

栈是一种先进后出的数据结构。即越先放入其的元素,只能越后出来;越后放入其中的元素,能越先出来

它的结构图是这样的:

栈的结构图
可以看到,栈就像一个桶,只能从顶端开始添加或取出元素。

C++中的栈

在C++标准库中,已经使用了模板与泛型的特性帮我们制作了栈这一数据结构在头文件stack中,使用样例如下:

#include <stack>//C++标准库中栈的头文件
#include <iostream>
using namespace std;
int main()
{
    
    
	int a[5] = {
    
    1,2,3,4,5};
	stack<int>s;//尖括号放栈内元素类型名
	for (int i = 0; i < 5; ++i)
	{
    
    
		s.push(a[i]);//push函数让元素入栈
	}
	for (int i = 0; i < 5; ++i)
	{
    
    
		cout << s.top() << endl;//top函数返回对栈顶元素的引用
		s.pop();//pop函数删除栈顶元素
	}
	if (s.empty())//empty函数返回栈是否没有元素,如果没有元素(空栈)就返回true,有元素就返回false
	{
    
    
		cout << "栈空了" << endl;
	}
}

输出结果:

5
4
3
2
1
栈空了

栈在游戏开发中的一些应用:

UE4基于栈状态机的UI管理(框架设计)

队列

队列的概念

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。——百度百科

结构图:
队列

C++中的队列

C++标准库提供了queue在头文件queue中,使用样例如下:

#include<queue>//C++标准库中队列的头文件
#include <iostream>
using namespace std;
int main()
{
    
    
	queue<int>a;//尖括号内放类型名
	for (int i = 0; i < 10; ++i)
	{
    
    
		a.push(i);//使用push()在队尾添加元素
	}
	cout << a.back() << endl;//使用back()输出队尾元素的值
	int len = a.size();//使用size()获取队列长度
	for (int i = 0; i < len; ++i)
	{
    
    
		cout << a.front() << endl;//使用front()输出队尾头元素的值
		a.pop();//使用pop()输出队头元素
	}
	if (a.empty())//使用empty()判断队列是否没有元素(队空)
	{
    
    
		cout << "队空" << endl;
	}
}

虚幻引擎中的队列

可以看这篇文章:
UE4的队列TQueue

优先队列

优先队列的概念

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。——百度百科

C++中的优先队列

推荐教程导航:
C++ 优先队列(priority_queue)

猜你喜欢

转载自blog.csdn.net/lifesize/article/details/128696707