概述

数据结构是计算机科学中用于存储、组织和管理数据的方式。C++ 提供了多种内置数据结构和容器,同时也支持用户自定义数据结构,以适应不同应用场景。掌握数据结构能够帮助我们提高程序的效率、降低时间和空间复杂度,并编写高效、可维护的代码。


1. 内置数据结构与基本数据类型

  • 数组(Array)
    • 固定大小的连续存储结构,适合随机访问。
    • C++ 中有 C 风格数组(int arr[10];)和 STL 的 std::array(固定大小数组)。
  • 指针与引用
    • 指针和引用用于动态内存管理和间接访问数据,是构建链表、树等数据结构的基础。

2. STL 容器(Standard Template Library Containers)

STL 提供了丰富的数据结构容器,常用的包括:

  • 序列容器
    • std::vector:动态数组,支持随机访问和尾部插入删除操作。
    • std::deque:双端队列,支持在两端高效插入删除。
    • std::list:双向链表,适合频繁的插入和删除操作,但随机访问较慢。
    • std::forward_list:单向链表,内存占用更少。
  • 关联容器
    • std::setstd::multiset:基于红黑树实现的集合,自动排序并去重或允许重复元素。
    • std::mapstd::multimap:键值对存储,基于平衡二叉搜索树,支持按键快速查找。
    • std::unordered_setstd::unordered_map:基于哈希表实现,查找和插入操作平均时间复杂度为 O(1)。
  • 适配器容器
    • std::stack:基于 deque 或 list 实现的栈(后进先出,LIFO)。
    • std::queue:基于 deque 实现的队列(先进先出,FIFO)。
    • std::priority_queue:基于堆实现的优先队列,自动按照元素优先级排序。

3. 自定义数据结构

在实际开发中,根据具体问题需求可能需要实现特定的数据结构。常见的自定义数据结构包括:

  • 链表(Linked List)
    • 单向链表、双向链表:适用于需要频繁插入删除的场景。
    • 循环链表:尾部连接到头部,形成循环结构。
  • 树(Tree)
    • 二叉树、二叉搜索树(BST):适合实现排序、查找、遍历等操作。
    • 平衡树(如 AVL 树、红黑树):保证树的平衡性,提供更高效的查找和插入删除操作。
    • 堆(Heap):常用作优先队列,支持快速获取最大值或最小值。
  • 图(Graph)
    • 顶点和边构成的结构,用于表示网络、路线图、社交关系等。
    • 表示方式有邻接矩阵、邻接表和边集列表等。
  • 哈希表(Hash Table)
    • 支持平均 O(1) 时间复杂度的查找、插入和删除操作。
    • STL 的 std::unordered_mapstd::unordered_set 就是哈希表的应用。

4. 算法与数据结构的结合

  • 数据结构与算法密切相关,常见算法(如排序、查找、遍历)往往依赖于合适的数据结构来实现高效性能。
  • STL 提供了大量的算法(如 std::sortstd::findstd::accumulate 等),它们可以与容器无缝结合,帮助快速实现复杂操作。

5. 示例:自定义单向链表

下面是一个简单的单向链表实现示例:

#include <iostream>
using namespace std;

// 定义链表节点
struct Node {
    int data;
    Node* next;
};

// 创建新节点
Node* createNode(int value) {
    Node* newNode = new Node;
    newNode->data = value;
    newNode->next = nullptr;
    return newNode;
}

// 在链表头部插入新节点
void insertAtHead(Node*& head, int value) {
    Node* newNode = createNode(value);
    newNode->next = head;
    head = newNode;
}

// 遍历链表并输出数据
void printList(Node* head) {
    Node* current = head;
    while (current != nullptr) {
        cout << current->data << " ";
        current = current->next;
    }
    cout << endl;
}

// 释放链表内存
void freeList(Node* head) {
    while (head) {
        Node* temp = head;
        head = head->next;
        delete temp;
    }
}

int main() {
    Node* head = nullptr;  // 初始化空链表
    insertAtHead(head, 10);
    insertAtHead(head, 20);
    insertAtHead(head, 30);
    
    cout << "链表内容:";
    printList(head);
    
    freeList(head);
    return 0;
}

输出:

链表内容:30 20 10 


参考资料


总结

C++ 提供了丰富的数据结构支持,从内置数组到 STL 容器,再到自定义链表、树和图等高级数据结构。理解和掌握各种数据结构的特点及其适用场景,不仅有助于选择最佳的数据存储方式,还能提高算法效率,从而编写出高效、健壮的程序。