链表容器(list container in STL)

list的底层由双向链表(doubly linked list)实现而成,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供 [] 操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的插入和删除操作。

list 容器可用的成员函数

成员函数功能
begin()返回指向容器中第一个元素的双向迭代器。
end()返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。
rbegin()返回指向最后一个元素的反向双向迭代器。
rend()返回指向第一个元素所在位置前一个位置的反向双向迭代器。
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
size()返回当前容器实际包含的元素个数。
max_size()返回容器所能包含元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
assign()用新元素替换容器中原有内容。
push_front()在容器头部插入一个元素。
pop_front()删除容器头部的一个元素。
push_back()在容器尾部插入一个元素。
pop_back()删除容器尾部的一个元素。
insert() 在容器中的指定位置插入元素。
erase()删除容器中一个或某区域内的元素。
swap()交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
resize()调整容器的大小。
clear()删除容器存储的所有元素。
splice()将一个 list 容器中的元素插入到另一个容器的指定位置。
remove(val)删除容器中所有等于 val 的元素。
remove_if()删除容器中满足条件的元素。
unique()删除容器中相邻的重复元素,只保留一个。
merge()合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。
sort()通过更改容器中元素的位置,将它们进行排序。
reverse()反转容器中元素的顺序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**************************************************************** 
 * 代码作者: Alex Li
 * 创建时间: 2023-05-27 21:33:42
 * 最后修改: 2025-01-10 21:34:15
 * 文件描述: list容器的使用
****************************************************************/
#include <iostream>
#include <list>

using namespace std;

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main() {
    list<int> lst;

    // 添加节点到链表尾部
    lst.push_back(10);
    lst.push_back(20);
    lst.push_back(30);

    // 打印链表内容
    cout << "链表内容:" << endl;
    for (int val : lst) {
        cout << val << " -> ";
    }
    cout << "NULL" << endl;

    // 在链表头部插入节点
    lst.push_front(5);
    cout << "在头部插入5后:" << endl;
    for (int val : lst) {
        cout << val << " -> ";
    }
    cout << "NULL" << endl;

    // 使用insert在第二个位置插入15
    //list<int>::iterator it = lst.begin(); 
    auto it = lst.begin();
    advance(it, 1); // 移动迭代器到第二个位置
    lst.insert(it, 15);
    
    cout << "在第二个位置插入15后:" << endl;
    for (int val : lst) {
        cout << val << " -> ";
    }
    cout << "NULL" << endl;

    // 在第三个位置插入3个值为9的节点
    it = lst.begin();
    advance(it, 3); // 移动迭代器到第三个位置
    lst.insert(it, 3, 9);
    cout << "在第三个位置插入3个值为9的节点后:" << endl;
    for (int val : lst) {
        cout << val << " -> ";
    }
    cout << "NULL" << endl;

    // 检查链表是否为空
    cout << "链表是否为空: " << (lst.empty() ? "是" : "否") << endl;

    // 打印链表大小
    cout << "链表大小: " << lst.size() << endl;

    // 删除值为20的节点
    it = find(lst.begin(), lst.end(), 20);
    if (it != lst.end()) {
        lst.erase(it);
    }
    cout << "删除值为20的节点后:" << endl;
    for (int val : lst) {
        cout << val << " -> ";
    }
    cout << "NULL" << endl;

    // 修改值为30的节点为40
    it = find(lst.begin(), lst.end(), 30);
    if (it != lst.end()) {
        *it = 40;
    }
    cout << "将值30修改为40后:" << endl;
    for (int val : lst) {
        cout << val << " -> ";
    }
    cout << "NULL" << endl;

    // 查找节点
    cout << "查找值为10的节点:" << (find(lst.begin(), lst.end(), 10) != lst.end() ? "存在" : "不存在") << endl;
    cout << "查找值为50的节点:" << (find(lst.begin(), lst.end(), 50) != lst.end() ? "存在" : "不存在") << endl;

    return 0;
}
Scroll to Top