浅谈C++ STL list 容器

本篇随笔简单讲解一下\(C++STL\)中\(list\)容器的使用方法和使用技巧。

list容器的概念

学习过\(C++STL\)的很多同学都知道,\(STL\)(标准模板库)中的容器其实都是我们在算法竞赛中常用数据结构的一些模板。比如说\(queue\)模拟的队列,\(priority\_queue\)模拟的堆等等。那么,我们可以把\(list\)理解为模拟数据结构中“双向链表”的模板。

关于双向链表的基本概念以及手动模拟实现,如有不懂的同学可以看这里:

详解数据结构—链表

简单来讲,链表就是数组的一个优化结构,它支持在任意两个元素中插入,也支持删除任意元素后把被删除元素的前后两个元素拼接在一起。

list容器的声明

\(list\)容器的声明和大部分\(STL\)容器的声明方式一样,都是:容器名<变量类型> 名称的结构。值得一提的是,\(list\)容器需要开#include<list>模板库。

#include<list>
list<int> l;
list<char> l;
list<pair<int,int> > l;
list<node> l;
struct node{...};

list容器的使用

与其他STL容器相似的用法

用法 作用
l.begin(),l.end() 返回list的首、尾迭代器
l.front(),l.back() 返回list的首、尾元素
l.push_back() 在链表后插入一个元素
l.push_front() 在链表前插入一个元素
l.pop_back() 在链表后删除一个元素
l.pop_front() 在链表前删除一个元素
l.clear() 清空链表
l.size() 返回链表中元素的个数
l.empty() 判断链表是否为空

插入操作

因为\(list\)支持在任意位置插入和删除,所以如果只能使用\(push\_front()\)和\(pop\_front()\)这种类型的成员函数未免就让它失去了链表的名头。

在\(list\)中,我们使用\(insert()\)函数来支持在任意位置加入元素。原理很简单,上传两个参数,一个是位置参数,一个是值的参数。注意,这里上传的位置参数需要时一个迭代器。这样,插入之后,这个插入元素会在迭代器指向元素的前一位

类似:

l.insert(it,val);

删除操作

删除操作有两种:一种是删除指定元素,一种是删除指定位置。这两种删除操作贴心地规划了用户在实际编写时可能遇到的问题。

其实也很简单啊。

如果删除的是某位置的元素,直接传这个位置的迭代器。

remove(it);

如果删除的是某个值,就直接传这个值:

remove(val);

这里需要注意:

  • 如果删除的是值,会删除当前链表中所有的这个值。

  • 如果删除的是位置上的元素,会导致这个迭代器从此失效,除非对其重新赋值,否则对其的所有操作都是错误的。这就像植物大战僵尸中的毁灭蘑菇,自己爆炸之后还会留下一个很久才会平的坑(我是颓多了么?)

浅谈C++ STL list 容器的更多相关文章

  1. 浅谈C++ STL string容器

    浅谈C++ STL string容器 本篇随笔简单讲解一下\(C++STL\)中\(string\)容器的使用方法及技巧. string容器的概念 其实\(string\)并不是\(STL\)的一种容 ...

  2. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

  3. 浅谈C++ STL queue 容器

    浅谈C++ STL queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(queue\)容器的使用方法和常见的使用技巧.\(queue\)容器是\(C++STL\)的一种比较基本的容器.我们 ...

  4. 浅谈C++ STL stack 容器

    浅谈C++ STL stack 容器 本篇随笔简单介绍一下\(C++STL\)中\(stack\)容器的使用方法和常见的使用技巧. stack容器的概念 \(stack\)在英文中是栈的意思.栈是一种 ...

  5. 浅谈C++ STL deque 容器

    浅谈C++ STL deque 容器 本篇随笔简单介绍一下\(C++STL\)中\(deque\)容器的使用方法及常见使用技巧. deque容器的概念 \(deque\)的意义是:双端队列.队列是我们 ...

  6. 浅谈C++ STL中的优先队列(priority_queue)

    从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...

  7. 浅谈C++ STL

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  8. C++ STL中的常用容器浅谈

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...

  9. 浅谈 Vector

    目录 浅谈Vector 1.容器基本操作 2.vector 初始化 3.vector的赋值与swap 4.vector的增删改除 1.增加元素 2.访问元素 3.删除元素 4.元素的大小 浅谈Vect ...

随机推荐

  1. 用python重新定义【2019十大网络流行语】

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:朱小五 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  2. PlayJava Day025

    JTable 用JTable类可以以表格的形式显示和编辑数据 JTable类的对象并不存储数据,它只是数据的表现 MVC 数据.表现和控制三者分离,各负其责 M = Model(模型) V = Vie ...

  3. 2019QM大作业2-weyl半金属Landau Level

    目录 说明 for cnblog QM大作业2--weyl半金属的Landau Level \(\boldsymbol{Abstract}\) 说明 Landau Level 自旋与pauli mat ...

  4. Rsync实现文件的同步

    故事背景:我们公司是做新零售的,需要对发布的每台机器进行文件的同步更新,所以我这里做了一个小小的调研 技术调研:linux之间同步文件有两种方式rsync与scp. sync和scp在文件夹均不存在时 ...

  5. maven配置多个镜像

    问题场景 1.国内访问maven默认远程中央镜像特别慢 2.用阿里的镜像替代远程中央镜像 3.大部分jar包都可以在阿里镜像中找到,部分jar包在阿里镜像中没有,需要单独配置镜像 解决方案 setti ...

  6. SpringCloudGateway开发详解

    路由简介: SpringCloudGateWay 是用于替代zuul作为API网关,在gateway中有三个重要的名词:过滤器,断言,路由 过滤器与断言是路由的一部分,路由便是将请求进行一系列的处理后 ...

  7. Node.js实现图片上传功能

    node接口实现 const express = require('express') const mysql = require('mysql') const cors = require('cor ...

  8. 【问题篇四】启动报DataSource错误

    初建一个简单的spring boot 项目,启动后会报错:就是在项目启动的时候在 resource目录下没有加载到配置信息:如果项目只是想简单的启动运行,不进行数据库操作可以在 启动类上做如下处理便可 ...

  9. my-eclipse 安装与下载

    百度网盘下载 链接:https://pan.baidu.com/s/13FFcVLyofd2TBP0zun0zTg 提取码:8ofg MyEclipse CI 2019是一个十分优秀的用于开发Java ...

  10. 富文本编辑器 tinymce 的安装与使用

    百度的富文本编辑器大家都熟悉,那么下面给大家介绍一款富文本编辑器tinymce ,个人感觉比百度的界面好看,调用方便,就不知道各位大神怎么看咯! tinymce中文文档 以下是vue中使用示例,献上最 ...