list容器

SyEic_L MVP++

list容器简介

  • list是一个双向链表容器,可高效进行插入删除元素
  • 不可以随机存取元素,不支持at.(pos)函数和[]操作符(下标)
  • #include <list>

构造

  • 采用模板类实现,默认构造形式:list<T> lst

    list<int> lstInt; //定义一个存放int的list容器

    list<float> lstFloat; //定义一个存放float的list容器

    list<string> lstString; //定义一个存放string的list容器

  • 带参数构造
    list<int> lstIntA(n, elem); //构造函数将n个elem拷贝给本身
    list<int> lstIntB(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身
    list<int> lstIntC(const list &lst); //拷贝构造函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    list<int> lst1(3, 5);	//5, 5, 5

    list<int> lst;
    lst.push_back(1);
    lst.push_back(2);
    lst.push_back(3);
    lst.push_back(4);
    list<int>::iterator beg = lst.begin();
    beg++;
    list<int>::reverse_iterator rbeg = lst.rbeg();
    rbeg;
    list<int> lst2(beg, rbeg); //2, 3

    list<int> lst3(lst); //1, 2, 3, 4

添加删除元素

list.push_back(elem); //在尾部插入元素

list.push_front(elem); //在头部插入元素

list.pop_back(); //删除尾部元素

list.pop_front(); //删除头部元素

访问元素

int x = list.front(); //返回值为第一个节点元素,赋值给x

int x = list.back();

list.front() = 100; //可以访问节点赋值

迭代器

  • 双向迭代器:从两个方向读写

    list.begin(); //返回第一个元素的迭代器

    list.end(); //返回最后一个元素之后的迭代器

    list.rbegin(); //返回倒数第一个元素的迭代器

    list.rend(); //返回倒数最后一个后面(第一个前面)的迭代器

    list无法begin()+n,只能begin()++

赋值

list.assign(beg, end); //将[beg, end)的数据拷贝赋值给本身

list.assigh(n, elem); //将n个elem拷贝赋值给本身

list& operator = (const list &lst); //重载等号操作符

list.swap(lst); //将lst与本身的元素互换

大小

list.size(); //容器中元素的个数

list.empty(); //判断容器是否为空

list.resize(num); //重新指定大小,变短则删除,变长则以默认值填充

list.resize(num, elem); //重新指定大小,变短则删除,变长则以elem填充

插入

list.insert(pos, elem); //在pos插入elem

list.insert(pos, n, elem); //在pos插入n个elem

List.insert(pos, beg, end); //在pos插入[beg, end)

删除

list.clear(); //删除容器所有数据

list.erase(beg, end); //删除[beg, end)中的元素,返回下一个元素的位置

list.erase(pos); //删除pos位置的元素,返回下一个元素的位置

list.remove(elem); //删除容器中所有与elem值匹配的元素

反转

list.reverse(); //反转list容器

迭代器失效

删除结点导致迭代器失效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
list<int> lst;
lst.push_back(1);
lst.push_back(3);
lst.push_back(2);
lst.push_back(3);
lst.push_back(4);
list<int>:: iterator it;

//错误代码
for (it = lst.begin(); it != lst.end(); it++){
if (*it == 3){
lst.earse(it); //把it删除后,指针所指位置被回收,变成野指针
}
}

//正确代码
for (it = lst.begin(); it != lst.end(); ){
if (*it == 3){
it = lst.erase(it);
}
else{
it++;
}
}
  • Title: list容器
  • Author: SyEic_L
  • Created at : 2025-02-27 21:52:46
  • Updated at : 2025-03-12 22:19:05
  • Link: https://blog.syeicl.vip/2025/02/27/list容器/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments