C++ 数据结构

ops/2024/12/22 21:48:28/

C++ 提供了多种数据结构,既有基础的如数组、结构体、类等,也有高级的 STL 容器如 vectormap 和 unordered_map 等。

下面详细介绍 C++ 中常用的数据结构及其特点和用法。

1. 数组(Array)

数组是最基础的数据结构,用于存储一组相同类型的数据。

特点

  • 固定大小,一旦声明,大小不能改变。
  • 直接访问元素,时间复杂度为 O(1)。
  • 适合处理大小已知、元素类型相同的集合。
int arr[5] = {1, 2, 3, 4, 5};
cout << arr[0]; // 输出第一个元素

优缺点

  • 优点:访问速度快,内存紧凑。
  • 缺点:大小固定,无法动态扩展,不适合处理大小不确定的数据集。

2. 结构体(Struct)

结构体允许将不同类型的数据组合在一起,形成一种自定义的数据类型。

特点

  • 可以包含不同类型的成员变量。
  • 提供了对数据的基本封装,但功能有限。

示例

struct Person {string name;int age;
};
Person p = {"Alice", 25};
cout << p.name << endl; // 输出 Alice

3. 类(Class)

类是 C++ 中用于面向对象编程的核心结构,允许定义成员变量和成员函数。与 struct 类似,但功能更强大,支持继承、封装、多态等特性。

特点

  • 可以包含成员变量、成员函数、构造函数、析构函数。
  • 支持面向对象特性,如封装、继承、多态。
class Person {
private:string name;int age;
public:Person(string n, int a) : name(n), age(a) {}void printInfo() {cout << "Name: " << name << ", Age: " << age << endl;}
};
Person p("Bob", 30);
p.printInfo(); // 输出: Name: Bob, Age: 30

4. 链表(Linked List)

链表是一种动态数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

特点

  • 动态调整大小,不需要提前定义容量。
  • 插入和删除操作效率高,时间复杂度为 O(1)(在链表头部或尾部操作)。
  • 线性查找,时间复杂度为 O(n)。
struct Node {int data;Node* next;
};
Node* head = nullptr;
Node* newNode = new Node{10, nullptr};
head = newNode; // 插入新节点

优缺点

  • 优点:动态大小,适合频繁插入和删除的场景。
  • 缺点:随机访问效率低,不如数组直接访问快。

5. 栈(Stack)

栈是一种后进先出(LIFO, Last In First Out)的数据结构,常用于递归、深度优先搜索等场景。

特点

  • 只允许在栈顶进行插入和删除操作。
  • 时间复杂度为 O(1)。
stack<int> s;
s.push(1);
s.push(2);
cout << s.top(); // 输出 2
s.pop();

优缺点

  • 优点:操作简单,效率高。
  • 缺点:只能在栈顶操作,访问其他元素需要弹出栈顶元素。

6. 队列(Queue)

队列是一种先进先出(FIFO, First In First Out)的数据结构,常用于广度优先搜索、任务调度等场景。

特点

  • 插入操作在队尾进行,删除操作在队头进行。
  • 时间复杂度为 O(1)。
queue<int> q;
q.push(1);
q.push(2);
cout << q.front(); // 输出 1
q.pop();

优缺点

  • 优点:适合按顺序处理数据的场景,如任务调度。
  • 缺点:无法随机访问元素。

7. 双端队列(Deque)

双端队列允许在两端进行插入和删除操作,是栈和队列的结合体。

特点

  • 允许在两端进行插入和删除。
  • 时间复杂度为 O(1)。
deque<int> dq;
dq.push_back(1);
dq.push_front(2);
cout << dq.front(); // 输出 2
dq.pop_front();

优缺点

  • 优点:灵活的双向操作。
  • 缺点:空间占用较大,适合需要在两端频繁操作的场景。

8. 哈希表(Hash Table)

哈希表是一种通过键值对存储数据的数据结构,支持快速查找、插入和删除操作。C++ 中的 unordered_map 是哈希表的实现。

特点

  • 使用哈希函数快速定位元素,时间复杂度为 O(1)。
  • 不保证元素的顺序。
unordered_map<string, int> hashTable;
hashTable["apple"] = 10;
cout << hashTable["apple"]; // 输出 10

优缺点

  • 优点:查找、插入、删除操作效率高。
  • 缺点:无法保证元素顺序,哈希冲突时性能会下降。

9. 映射(Map)

map 是一种有序的键值对容器,底层实现是红黑树。与 unordered_map 不同,它保证键的顺序,查找、插入和删除的时间复杂度为 O(log n)。

特点

  • 保证元素按键的顺序排列。
  • 使用二叉搜索树实现。
map<string, int> myMap;
myMap["apple"] = 10;
cout << myMap["apple"]; // 输出 10

优缺点

  • 优点:元素有序,适合需要按顺序处理数据的场景。
  • 缺点:操作效率比 unordered_map 略低。

10. 集合(Set)

set 是一种用于存储唯一元素的有序集合,底层同样使用红黑树实现。它保证元素不重复且有序。

特点

  • 保证元素的唯一性。
  • 元素自动按升序排列。
  • 时间复杂度为 O(log n)。
set<int> s;
s.insert(1);
s.insert(2);
cout << *s.begin(); // 输出 1

优缺点

  • 优点:自动排序和唯一性保证。
  • 缺点:插入和删除的效率不如无序集合。

11. 动态数组(Vector)

vector 是 C++ 标准库提供的动态数组实现,可以动态扩展容量,支持随机访问。

特点

  • 动态调整大小。
  • 支持随机访问,时间复杂度为 O(1)。
  • 当容量不足时,动态扩展,时间复杂度为摊销 O(1)。
vector<int> v;
v.push_back(1);
v.push_back(2);
cout << v[0]; // 输出 1

优缺点

  • 优点:支持随机访问,动态扩展。
  • 缺点:插入和删除中间元素的效率较低。

http://www.ppmy.cn/ops/124035.html

相关文章

python 实现bellman ford贝尔曼福特算法

bellman ford贝尔曼福特算法介绍 贝尔曼-福特算法&#xff08;Bellman-Ford&#xff09;是由理查德贝尔曼&#xff08;Richard Bellman&#xff09;和莱斯特福特&#xff08;Lester Ford&#xff09;创立的&#xff0c;用于求解单源最短路径问题的一种算法。这种算法也被称为M…

浸入式电磁流量计如何工作?

磁力如何产生可感应电压&#xff1f; 所有磁流量计都利用法拉第感应定律的指导原理&#xff0c;该定律显示了“表达变化的磁场在电路中感应出电压的定量关系”。 该感应定律可用于测量导体液体&#xff08;如水&#xff09;的速度&#xff0c;而无需移动部件。与其他类型的仪…

JavaEE中记录日志

日志 在JavaEE中&#xff0c;日志是一项关键的开发和运维工具&#xff0c;以下是关于JavaEE中日志的概念、作用及优点的详细阐述&#xff1a; 一、日志的概念 日志是记录软件系统在运行过程中的各种信息的一种机制。在JavaEE中&#xff0c;日志通常通过特定的日志框架&#…

聚焦AI|智享AI直播三代模型的出现,打破传统直播束缚!

聚焦AI|智享AI直播三代模型的出现&#xff0c;打破传统直播束缚! 在数字化浪潮的推动下&#xff0c;直播行业正经历着前所未有的变革与升级。其中&#xff0c;智享AI直播三代模型的出现&#xff0c;无疑成为了业界关注的焦点。这一创新技术不仅引发了关于无人直播未来发展方向的…

OJ在线评测系统 微服务技术入门 单体项目改造为微服务 用Redis改造单机分布式锁登录

单体项目改造为微服务 什么是微服务 服务&#xff1a;提供某类功能的代码 微服务&#xff1a;专注于提供某类特定功能的代码 而不是把所有的代码放到同一个项目里 会把一个大的项目按照一定的功能逻辑进行划分 拆分成多个子模块 每个子模块可以独立运行 独立负责一类功能 …

C# 中抽象类与接口的异同

一、引言 在 C# 编程中&#xff0c;抽象类和接口都是实现代码复用和多态性的重要工具&#xff0c;但它们在很多方面存在差异。理解这些异同&#xff0c;有助于开发者在实际项目中做出恰当的选择&#xff0c;以构建高效且可维护的软件系统。 二、抽象类 &#xff08;一&#…

洛谷 P11045 [蓝桥杯 2024 省 Java B] 最优分组

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 首先得注意这么一点&#xff1a; k k k 必须得是 n n n 的因数&#xff08;这里的 n , k n,k n,k 对应于题目的 N ,…

Github 2024-10-08 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-10-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次关注人数…