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的更多相关文章

  1. RMAN详细教程(三):备份脚本的组件和注释

    RMAN详细教程(一):基本命令代码 RMAN详细教程(二):备份.检查.维护.恢复 RMAN详细教程(三):备份脚本的组件和注释 RMAN详细教程(四):备份脚本实战操作 一.基本组件: 1.Ser ...

  2. 为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  3. 详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus

    [大伽说]如何运维千台云服务器 »   CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.L ...

  4. 转载:【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  5. 最详细STL(一)vector

    vector的本质还是数组,但是可以动态的增加和减少数组的容量(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间),首先先讲讲vector和数组的具体区别 一.vector和数组的区 ...

  6. STL三种标准容器

    顺序性容器 vector:从后面快速的插入与删除,直接访问任何元素 deque:从前面或后面快速的插入与删除,直接访问任何元素 list: 双链表,从任何地方快速的插入与删除 关联容器 set:快速查 ...

  7. logback详细配置(三)

    转自:http://blog.csdn.net/haidage/article/details/6794540 <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NE ...

  8. 详解三种缓存过期策略LFU,FIFO,LRU(附带实现代码)

    在学操作系统的时候,就会接触到缓存调度算法,缓存页面调度算法:先分配一定的页面空间,使用页面的时候首先去查询空间是否有该页面的缓存,如果有的话直接拿出来,如果没有的话先查询,如果页面空间没有满的时候, ...

  9. 【iCore2双核心板视频教程】 AD模块(iM_AD_GP和iM_AD_SYNC)介绍及数据采集实验三

    建议设定成 “超清” 模式并 “全屏” 观看. ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiao ...

  10. 16Aspx.com源码2013年10月到2013年12月详细

    创建时间FROM: 创建时间TO:   ExtJS合同管理信息系统源码 2013-12-13   [VS2008] 源码介绍: ExtJS合同管理信息系统源码浏览器兼容:IE,Firefox,谷歌等主 ...

随机推荐

  1. 设备树DTS 学习:3-驱动开发中常用的 DTS api

    背景 本章的内容是为了实现在驱动中的开发,通过调用有关的api来寻找设备树节点熟悉,从而达到使用设备树进行驱动开发的目的. 参考:Linux内核 设备树操作常用API Linux设备树语法详解一文中介 ...

  2. 流程图渲染方式:Canvas vs SVG

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霁明 背景 我们产品中会有一些流程图应用,例如审批中心的审 ...

  3. podman安装mysql容器

    前言 mysql如果正式安装,卸载起来比较麻烦.如果是自己测试用的话,可以用podman拉取一个镜像来使用. 这里使用的是mysql5.7版本,对应的docker镜像是mysql:5.7 (如果拉取较 ...

  4. .NET 9 预览版 5 发布

    微软在6月发布了.NET 9预览版的第五个版本.这个新版本的框架预计将在今年晚些时候正式发布,它是一个标准支持(STS)版本,将在2024年11月12日至2026年5月12日期间在多个操作系统上获得1 ...

  5. 历代iPad及Android平板的主要参数对比

    「程序员的备忘录系列」这笔记可是持续更新的哦     逻辑分辨率Point,也就是CSS像素,是进行网页适配的关键,以下是平时整理的一些备忘录数据,可以收藏. 以现在平板的销量,还没有手机的十分之一, ...

  6. PHP进阶

    只是简要说明起原理和用法,具体可以百度 abstract 抽象类 抽象类是指在 class 前加了 abstract 关键字且存在抽象方法,不带{},如public function test() i ...

  7. 用IO多路复用实现 nginx 静态资源代理(C/Java/Golang)

    用IO多路复用实现 nginx 静态资源代理(C/Java/Golang) 效果展示 代理 HTML 代理图片 注意, 静态资源代理基于 HTTP, 可以了解上一篇文章: 几十行代码使用TCP简单实现 ...

  8. RHCA rh442 002 监控工具 脏页 块设备名 缓存

    sar 看某一个时间的数据 sar -d 1 5 与iostat类似 计算机识别设备按编号识别 0-15预留出 8 为iscsi设备 做一个块设备名 名字不重要是给人看的,重要的是编号 8 17(主编 ...

  9. 11、SpringMVC之文件下载和上传

    创建名为spring_mvc_file的新module,过程参考9.1节和9.5节 11.1.文件下载 11.1.1.创建图片目录并放置图片 11.1.2.页面请求示例 <a th:href=& ...

  10. 【Redis】04 配置文件分析

    配置文件Redis.conf注释信息: 1.启动项: 启动Redis要求必须加上配置文件redis.conf路径作为第一参数加载 文档样例: ./redis-server /path/to/redis ...