C++(初阶)(十一)——list

发布于:2025-04-15 ⋅ 阅读:(33) ⋅ 点赞:(0)

十一,list

带头循环双向链表。

遍历方式:迭代器,不再支持operate[],operate[]适用于底层是数组的结构。

remove删除值,如果有多个相同的值,都会删除。
在这里插入图片描述

接口介绍

下面会介绍list的一些接口

构造

构造函数(constructor 接口说明 注意点
list (size_type n, const value_type& vall = value_type()) 构造的list中包含n个值为val的元素
list() 构造空的list
list (const list& x) 拷贝构造函数
list (InputIterator fifirst, InputIterator last) 用[first, last)区间中的元素构造 区间是左开右闭的,并且list并不支持+,-的操作
构造使用与遍历

[list构造与遍历](https://gitee.com/any10/c_plus_plus/blob/master/2025c%2B%2B/list_4_13_ 接口/list构造与遍历/test.cpp)

1,begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动

2,rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

Modifiers(修饰语句)

函数名 接口说明 函数声明
push_front 在list首元素前插入值为val的元素 void push_front (const value_type& val);void push_front (value_type&& val);
pop_front 删除首元素 void pop_front();
push_back 尾部插入值为val的元素 void push_back (const value_type& val);void push_back (value_type&& val);
pop_back 删除尾元素 void pop_back();
insert 在list position位置插入值为val的元素 insert
erase 删除list position位置的元素 iterator erase (const_iterator position);iterator erase (const_iterator first, const_iterator last);
swap 交换两个list中的元素 void swap (list& x);
clear 清空list中的有效元素 void clear() noexcept;(noexcept该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化。)
简单使用

[list插入删除](https://gitee.com/any10/c_plus_plus/blob/master/2025c%2B%2B/list_4_13_ 接口/list插入删除/test.cpp)

模拟实现

初步实现

完善

list和vector的对比

vector list
底层结构 动态顺序表,一段连续空间 带头结点的双向循环链表
随机访问 支持随机访问,访问某个元素效率为O(1) 不支持随机访问,访问某个元素效率为O(N)
插入和删除 任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低 任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)
空间利用率 底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高 底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低**
迭代器 原生态指针 对原生态指针(节点指针)进行封装**
迭代器失效 在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值否则会失效 插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不会受影响
使用场景 需要高效存储,支持随机访问,不关心插入删除效 大量插入和删除操作,不关心

vector

优点:1,支持下标访问。

2,CPU高速缓存命中率高。

缺点:1,头部和中部插入删除效率低下,因为要挪动数据。

2,扩容有一定成本,存在一定空间浪费。

list

缺点:1,不支持下标随机访问。

2,CPU高速缓存命中率低。

优点:1,任意位置可以O(1)插入删除,不需要挪动数据。

2,不需要扩容,按需申请释放,不浪费空间。

CPU要访问内存一个数据,要看这个数据是否在缓存,在就叫缓存命中,不在就是不命中;不命中就要先加载到缓存,然后在访问缓存。

关于CPU缓存:https://coolshell.cn/articles/20793.html


网站公告

今日签到

点亮在社区的每一天
去签到