📜  矢量与链表 (1)

📅  最后修改于: 2023-12-03 15:41:00.984000             🧑  作者: Mango

矢量与链表

矢量与链表都是常用的数据结构,它们各有优缺点,因此在不同场景下选择不同的数据结构可以更好地提高程序效率和性能。下面分别介绍这两种数据结构。

矢量

矢量也被称作动态数组(Dynamic Array),是一种可以随着数据数量的增长而不断扩容的数据结构。矢量可以在一段连续的内存空间中存储元素,因此可以快速随机访问元素。

矢量的插入和删除操作比较费时,因为需要移动后续的元素。但是,由于矢量的元素都在连续的内存空间中,使得缓存友好,访问效率高,适用于需要大量读取和随机访问元素的场景。

以下是矢量的 C++ 代码示例:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v = {2, 4, 6, 8};

    v.push_back(10);  // 向向量尾部插入元素
    cout << v[0] << endl;  // 随机访问元素
    cout << v.size() << endl;  // 获取元素个数
    v.erase(v.begin());  // 删除第一个元素
    v.clear();  // 清空向量

    return 0;
}
链表

链表是一种可以在不连续的内存空间中存储元素,通过指针连接起来的数据结构。链表的插入和删除操作比较快速,因为只需要修改指针指向即可,但是随机访问元素比较费时,需要从头部开始一个一个地遍历寻找。

链表适用于需要频繁添加或删除元素,但是不需要随机访问元素的场景。同时,由于链表的元素可以不必在连续的内存空间中存储,因此可以动态分配内存,更加灵活。

以下是链表的 C++ 代码示例:

#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
    // 创建链表
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);

    // 遍历链表
    ListNode* cur = head;
    while (cur != NULL) {
        cout << cur->val << " ";
        cur = cur->next;
    }
    cout << endl;

    // 插入元素
    ListNode* node = new ListNode(5);
    node->next = head->next;
    head->next = node;

    // 删除元素
    head->next = head->next->next;

    // 释放链表内存
    cur = head;
    while (cur != NULL) {
        ListNode* temp = cur;
        cur = cur->next;
        delete temp;
    }

    return 0;
}

总之,矢量和链表都是常用的数据结构,它们各自的优缺点需要根据具体的场景进行选择。