最详细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,谷歌等主 ...
随机推荐
- 信奥一本通1164:digit函数
1164:digit函数 时间限制: 1000 ms 内存限制: 65536 KB 提交数:41504 通过数: 26475 [题目描述] 在程序中定义一函数digit(n,k) ,它能分离出整数n ...
- 韦东山freeRTOS系列教程之【第八章】事件组(event group)
目录 系列教程总目录 概述 8.1 事件组概念与操作 8.1.1 事件组的概念 8.1.2 事件组的操作 8.2 事件组函数 8.2.1 创建 8.2.2 删除 8.2.3 设置事件 8.2.4 等待 ...
- fpga是什么
FPGA(Field Programmable Gate Array) 现场可编程门阵列
- Centos7安装MySQL详细步骤(配置开机自启)
MySQL 检查系统是否安装过mysql //检查系统中有无安装过mysql rpm -qa|grep mysql //查询所有mysql 对应的文件夹,全部删除 whereis mysql find ...
- windows server + iis 部署若伊前端vue项目
一.背景说明 工作原因,一直使用若伊前后端分离版框架进行二次开发.客户的服务器多数为windows server系统,少部分为linux系统.过去一直是使用nginx进行前端的部署,nginx的代理功 ...
- VulnHub-Narak靶机渗透流程
VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...
- Linux使用Tomcat常用命令
切换到tomcat主目录下 cd usr/local/tomcat # 1.启动tomcat服务 # 方式一:直接启动 bin/startup.sh # 方式二:作为服务启动(推荐) nohup bi ...
- Acwing周赛分享
Acwing 周赛28 题面1 给定一个由大写字母构成的字符串 s,请计算其中有多少个子序列 QAQ. 注意,子序列不需要连续. 提示:本题数据范围较小,可以直接三重循环枚举三个字母的位置. 输入格式 ...
- 使用ES6中Class实现手写PromiseA+,完美通过官方872条用例
目录 Promise出现的原因 myPromise的实现要点 myPromise的实现 myPromise - 实现简单的同步 myPromise - 增加异步功能 myPromise - 链式调用( ...
- 题解:P10320 勇气(Courage)
P10320 勇气(Courage) 推导过程 本题是一道数学题,重点是如何推导出正确式子. 首先,先特判几个特殊点: 当 \(n>=2\) 且 \(x=2\) 时,是不存在解的,战斗力无论何时 ...