Skip to content
On this page

list 容器讲解

  • 使用双向链表管理元素
  • list的元素可以是任意类型T,但必须具备赋值和拷贝能力
  • 必须包含的头文件#include <list>
  • list不支持随机存取,因此不提供下标操作符
  • 在任何位置上执行元素的安插和移除都非常快。
  • 安插和删除不会导致指向其他元素的指针、引用、iterator失效。

特性

  • 底层数据结构是双向链表
  • 不支持随机存取,所以不能使用下标操作
  • 在任意位置上插入和删除都很快
  • 插入和删除不会导致其它元素的指针,引用,iterator失效
plaintext
|------------------------------+----------------------------------------------------------|
| list                         |                                                          |
|------------------------------+----------------------------------------------------------|
| 支持的迭代器类型             | 双向                                                     |
|------------------------------+----------------------------------------------------------|
| 创建list                     |                                                          |
|------------------------------+----------------------------------------------------------|
| list<T> c                    | 创建一个空的list                                         |
| list<T> c1(c2)               | 复制c2创建一个c1 list                                    |
| list<T> c(n)                 | 创建n个元素,值是T类型的默认构造函数产生的                |
| list<T> c(n,e)               | 创建n个元素,值是e                                        |
| list<T> c(beg,end)           | 创建n个元素,以区间[beg,end)为初值                        |
| ~list<T>()                   | 销毁所有元素,释放内存                                    |
|------------------------------+----------------------------------------------------------|
| 基本操作                     |                                                          |
|------------------------------+----------------------------------------------------------|
| c.size()                     | 返回元素的个数                                           |
| c.empty()                    | 是否为空                                                 |
| c.max_size()                 | 返回元素的最大可能数量                                   |
| ==,!=,<,<=,>,>=              | 逻辑运算                                                 |
|------------------------------+----------------------------------------------------------|
| 赋值操作                     |                                                          |
|------------------------------+----------------------------------------------------------|
| c1 = c2                      | c2赋值给c1                                               |
| c.assign(n,e)                | 将元素e的n个拷贝赋值给c                                  |
| c.assign(beg,end)            | 将[beg,end)内的值赋给c                                   |
| c1.swap(c2)                  | 交换                                                     |
| swap(c1,c2)                  | 交换                                                     |
|------------------------------+----------------------------------------------------------|
| 存入读取                     |                                                          |
|------------------------------+----------------------------------------------------------|
| front()                      | 第一个元素的引用,不检查元素是否存在[1]                   |
| back()                       | 最后一个元素的引用,不检查元素是否存在                    |
|------------------------------+----------------------------------------------------------|
| 迭代器[2]                    |                                                          |
|------------------------------+----------------------------------------------------------|
| c.begin()                    | 指向第一个元素的迭代器                                   |
| c.end()                      | 指向最后一个元素后面一个位置的迭代器                     |
| rbegin()                     | 逆向迭代器,反向的第一个元素(也就是最后一个)迭代器        |
| rend()                       | 逆向迭代器,反向在最后一个元素后面一个位置的迭代器        |
|------------------------------+----------------------------------------------------------|
| 插入操作                     |                                                          |
|------------------------------+----------------------------------------------------------|
| c.insert(pos,e)              | pos位置(迭代器)前插入e的拷贝,返回新元素的位置的位置      |
| c.insert(pos,n,e)            | pos位置(迭代器)前插入e的n个拷贝                          |
| c.push_back(e)               | 在尾部压入元素e的拷贝                                    |
| c.push_front(e)              | 在头部压入元素e的拷贝                                    |
|------------------------------+----------------------------------------------------------|
| 删除操作                     |                                                          |
|------------------------------+----------------------------------------------------------|
| c.pop_back()                 | 删除最后一个元素,不会返回元素的引用                      |
| c.pop_front()                | 删除第一个元素,不会返回元素的引用                        |
| c.erase(pos)                 | 删除pos(迭代器)位置的元素,返回下一个元素的位置           |
| c.erase(beg,end)             | 删除[beg,end)位置内的元素,返回下一个元素的位置           |
| c.clear()                    | 删除所有元素,并清空容器所占的内存                        |
| c.resize(num)                | 将元素数量改为num,多佘的删除,多出的用default构造函数产生 |
| c.resize(num,e)              | 将元素数量改为num,多佘的元素为e的拷贝                    |
| c.remove(val)                | 删除值为val的元素                                        |
| c.remove_if(op)              | 删除op(val) == true 为的元素                             |
|------------------------------+----------------------------------------------------------|
| 特殊                         |                                                          |
|------------------------------+----------------------------------------------------------|
| c.unique()                   | 删除重复元素,只留一个                                    |
| c.unique(op)                 | 删除op(val) == true 重复的元素,只留一个                  |
| c.splice(pos,c2)             | 将c2的所有元素转移到c1 pos 之前                          |
| c.splice(pos,c2.c2pos)       | 将c2内的c2pos的元素移到pos之前                           |
| c.splice(pos,c2,c2beg,c2end) | 将c2内的[c2beg,c2end)内的元素移到c1 pos 之前             |
| c.sort()                     | 以 `<` 来排序                                              |
| c.sort(op)                   | 以op 为准排序                                            |
| c.merge(c2)                  | 归并排序c,c2,要求c,c2已经排序好                          |
| c.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

注: list的迭代器不是随机迭代器,不能进行这种操作iter+10,iter-10,也不能使用下标进行操作,只能使用这种iter++,iter--

创建list

c
#include <iostream>
#include <list>
using namespace std;
int a[] = {1,2,3,4,5};

void printList(list<int> l,string s){
    cout << s;
    list<int>::iterator iter = l.begin();

    for(;iter!=l.end();iter++){
        cout << *iter << " ";
    }
    cout << endl;
}

int main(){

    //创建
    list<int> c;
    printList(c,"c:");

    list<int> c1(10,1);
    printList(c1,"c1:");

    list<int> c2(c1);
    printList(c2,"c2:");

    list<int> c3(10);
    printList(c3,"c3:");

    list<int> c4(c3.begin(),c3.end());
    printList(c4,"c4:");

    list<int> c5(a,a+sizeof(a)/sizeof(a[0]));
    printList(c5,"c5:");

    return 0;
}
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

操作list

c
#include <iostream>
#include <list>
using namespace std;
int a[] = {1,2,3,4,5};

void printList(list<int> l,string s){
    cout << s;
    list<int>::iterator iter = l.begin();

    for(;iter!=l.end();iter++){
        cout << *iter << " ";
    }
    cout << endl;
}

int main(){
    list<int> c(a,a+sizeof(a)/sizeof(a[0]));
    printList(c,"c:");

    //基本操作
    cout << "c.size()" << c.size() << endl;
    cout << "c.empty()" << c.empty() << endl;
    cout << "c.max_size()" << c.max_size() << endl;

    //赋值
    list<int> c1 = c;
    printList(c1,"c1:");
    c1.swap(c);

    //操作元素
    c.insert(c.begin(),111);
    printList(c,"c:");
    c.insert(c.begin(),2,123);
    printList(c,"c:");

    c.push_back(321);
    c.push_front(321);
    printList(c,"c:");

    //删除
    c.pop_back();
    c.pop_front();
    printList(c,"c:");

    c.erase(c.begin()++);
    printList(c,"c:");
    c.erase(c.begin(),c.end()--);
    printList(c,"c:");

    c.clear();
    printList(c,"c:");

    return 0;
}
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