最详细STL(三)list
list就是链表啦,他的一个结点由两个指针域,一个数据域组成。list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1)。然而list也有一个致命的缺点,因为链表的空间申请是离散的,所以访问元素必须得通过迭代器来从头或者尾部遍历到要访问的元素,所以访问元素的时间复杂度是O(n)。
一、list的内存空间是不连续的
老规矩,先上代码给你们感受一下list内存的分配情况
#include<cstdio>
#include<list>
using namespace std; int main()
{
list<int > a(30);
for(int i=0;i<30;i++)
{
printf("%d\n", &a.front());
a.pop_front();
}
}

从箭头标记的地方可以看到内存直接从118多跳到了117多,然后从连续的内存中看到,一个list<int>的结点占了24个bytes,其中每个指针域8个bytes,每个int数据域占4bytes,前面也说了,一个list结点有俩指针域,一个数据域所以一共20个bytes。再根据字节对齐原则(可以参考:番外1 什么?sizeof(list<int>)竟然是24 - zju_cxl - 博客园 (cnblogs.com)),所以就是24个bytes了。
综上,list结点的内存是随机分布的,每个结点比单个数据变量占用的内存至少要多16个bytes。
下面开始正文了,我来告诉大家list什么时候用?怎么用?用的时候要注意些什么吧?
二、什么时候用
当不需要查询list中的值,或者需要频繁的在list中间插入值的时候,可以用list
三、怎么用
1.元素访问
| lt.front() | 查询list头元素 |
| lt.back() | 查询list尾元素 |
| lt.begin() | 生成头部迭代器 |
| lt.end() | 生成尾部迭代器 |
在迭代器的前面加r如lt.rbegin(),表示从右往左的迭代器,在迭代器前加c,表示用返回常量指针(可以用auto来接收,不用写那些又长又臭的std)
2.添加元素
| lt.push_back() | 尾部添加 |
| lt.push_front() | 头部添加 |
| lt.insert(pos, elem) | 指定位置添加 |
| lt.insert(pos, n , elem) | 指定位置添加n个值 |
| lt.insert(pos, begin, end) | 指定位置添加begin到end的值 |
3.删除元素
| lt.pop_back() | 删除list尾元素 |
| lt.pop_front() | 删除list头元素 |
| lt.erase(begin, end) | 删除指定区间的元素 |
| lt.erase(position) | 删除position位置的元素 |
| lt.remove(elem) | (所有)值为elem的就移除 |
| lt.remove_if(bool) | (所有)如果真,则移除 |
4.实用函数
| lt.splice() | 分割list |
| lt.sort() | 排序list |
| lt.merge() | 合并 |
| lt.reverse() | 反转 |
四、用的时候要注意什么?
先空着以后再填哈哈,
最详细STL(三)list的更多相关文章
- RMAN详细教程(三):备份脚本的组件和注释
RMAN详细教程(一):基本命令代码 RMAN详细教程(二):备份.检查.维护.恢复 RMAN详细教程(三):备份脚本的组件和注释 RMAN详细教程(四):备份脚本实战操作 一.基本组件: 1.Ser ...
- 为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...
- 详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
[大伽说]如何运维千台云服务器 » CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.L ...
- 转载:【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- 最详细STL(一)vector
vector的本质还是数组,但是可以动态的增加和减少数组的容量(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间),首先先讲讲vector和数组的具体区别 一.vector和数组的区 ...
- STL三种标准容器
顺序性容器 vector:从后面快速的插入与删除,直接访问任何元素 deque:从前面或后面快速的插入与删除,直接访问任何元素 list: 双链表,从任何地方快速的插入与删除 关联容器 set:快速查 ...
- logback详细配置(三)
转自:http://blog.csdn.net/haidage/article/details/6794540 <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NE ...
- 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)
在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...
- 【iCore2双核心板视频教程】 AD模块(iM_AD_GP和iM_AD_SYNC)介绍及数据采集实验三
建议设定成 “超清” 模式并 “全屏” 观看. ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiao ...
- 16Aspx.com源码2013年10月到2013年12月详细
创建时间FROM: 创建时间TO: ExtJS合同管理信息系统源码 2013-12-13 [VS2008] 源码介绍: ExtJS合同管理信息系统源码浏览器兼容:IE,Firefox,谷歌等主 ...
随机推荐
- 如何查看docker容器的volume挂载情况
准备在docker容器当中编写个日常维护的脚本,但容器里连yum和vim命令都没有,所以就想到通过容器映射在本机的volume里编写脚本这样在容器中不就可以直接用了吗,那么在这之前你首先得知道dock ...
- .NET 9 预览版 5 发布
微软在6月发布了.NET 9预览版的第五个版本.这个新版本的框架预计将在今年晚些时候正式发布,它是一个标准支持(STS)版本,将在2024年11月12日至2026年5月12日期间在多个操作系统上获得1 ...
- LeViT:Facebook提出推理优化的混合ViT主干网络 | ICCV 2021
论文提出了用于快速图像分类推理的混合神经网络LeVIT,在不同的硬件平台上进行不同的效率衡量标准的测试.总体而言,LeViT在速度/准确性权衡方面明显优于现有的卷积神经网络和ViT,比如在80%的Im ...
- thinkphp模型hasOne、hasMany、belongsTo详解
在ThinkPHP框架中,hasOne.hasMany和belongsTo是用于定义模型间一对多(1:n).一对一(1:1)和多对一(n:1)关联关系的方法.以下是一些简单的示例来解释这些关系: 1. ...
- let 和 const 是 JavaScript 中用于声明变量的关键字
let 和 const 是 JavaScript 中用于声明变量的关键字. let 关键字用于声明可变(可重新赋值)的变量.通过使用 let 关键字声明的变量可以在其作用域内被重新赋值.例如: let ...
- [oeasy]python0132_变量含义_meaning_声明_declaration_赋值_assignment
变量定义 回忆上次内容 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力 编程语言的基础都是变量声明 python是如何声明变量的呢? 变量 想要定义变量 ...
- openEuler 安装 DocekrCE
就个人而言,openEuler 算是不错的国产化操作系统."一脉传承"自redhat让实际的使用体验非常丝滑.软件源都是国内的,开箱即用,漏洞的补丁发的也挺及时.美中不足的是貌似 ...
- 新做了一个MySQL 数据库 DDL 差异对比的网站
MySQL 数据库 DDL 差异对比的网站 摘要 新做了个网站,用来对比不同环境下的 DDL 差异,生成变更点和 迁移 DDL 网站地址:https://ddlcompare.com/ 对比过程中如果 ...
- 人脸识别项目打包成exe的过程遇到的问题
我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多 ...
- 【WPF】Command 的一些使用方案
Command,即命令,具体而言,指的是实现了 ICommand 接口的对象.此接口要求实现者包含这些成员: 1.CanExecute 方法:确定该命令是否可以执行,若可,返回 true:若不可,返回 ...