IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> C++之STL——list类 -> 正文阅读

[系统运维]C++之STL——list类

list简介

1、list的插入和删除的时间复杂度是在常数范围内的序列式容器,并且由于list的底层是用双链表实现的,该容器支持双向迭代。
2、与其他序列式容器相比(array,vector,deque),list在任意位置进行插入和删除的效率更高。
3、list最大的缺陷就是不支持任意位置的随机访问。
在这里插入图片描述

list的使用

list的构造函数

构造函数接口说明
list()构造空的list
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list (const list& x)拷贝构造
list (InputIterator first, InputIterator last)使用迭代器构造

在这里插入图片描述
在这里插入图片描述

list的迭代器

在vector中,由于vector的底层是用连续空间进行存储的,因此原生指针就可以作为迭代器使用;但是list的底层是非连续空间,原生指针无法再作为迭代器,因此list的迭代器是通过模板封装实现的,这部分的底层原理放在下一篇博客模拟实现时进行详细解释。

迭代器接口说明
begin() + end()返回第一个元素的迭代器和返回最后一个元素的迭代器
rbegin() + rend()返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置

从图中可以看出,begin()是指向头节点的下一个节点,end()是指向头节点的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

list的capacity

capacity接口说明
capacity()检测list是否为空,是返回true,否则返回false
size()返回list中的有效节点个数

由于list的空间不是连续的,在使用时即插即用,因此list的底层没有改变空间和改变有效长度的函数reserve和resize。

list的元素提取

element access接口说明
front()返回list中第一个节点中的值
back()返回list中最后一个节点中的值

在这里插入图片描述
在这里插入图片描述

list的插入和删除

插入删除接口说明
push_front在list的第一个元素之前插入
pop_front删除list中的第一个元素
push_back在list的最后一个元素之后插入
pop_back删除list中的最后一个元素
insert在list的pos位置插入
erase删除list的pos位置的元素
clear清除list中的有效元素
list<int> v1;
  v1.push_back(1);
  v1.push_back(2);
  v1.push_back(3);
  v1.push_back(4);
  v1.push_back(5);
  v1.push_back(6);
  cout << "push_back(): ";
  for(auto e : v1)
    cout << e << " ";
  cout << endl;
  v1.push_front(10);
  v1.push_front(12);
  v1.push_front(13);
  cout << "push_front(): ";
  for(auto e : v1)
    cout << e << " ";
  cout << endl;
  v1.pop_back();
  v1.pop_back();
  cout << "pop_back(): ";
  for(auto e : v1)
    cout << e << " ";
  cout << endl;
  v1.pop_front();
  v1.pop_front();
  cout << "pop_front(): ";
  for(auto e : v1)
    cout << e << " ";
  cout << endl;
  list<int>::iterator pos = find(v1.begin(), v1.end(), 3);
  v1.insert(pos, 100);

  cout << "insert(): ";
  for(auto e : v1)
    cout << e << " ";
  cout << endl;

  
  pos = find(v1.begin(), v1.end(), 4);
  v1.erase(pos);

  cout << "erase(): ";
  for(auto e : v1)
    cout << e << " ";
  cout << endl;

在这里插入图片描述

list的迭代器失效

在前面的stl容器中已经介绍过了迭代器失效的问题,这里的迭代器可以理解为指针,迭代器失效指的是迭代器所指向的节点无效,即该节点所指向的空间被释放了或者已经无意义了,如果此时还在该节点的迭代器进行操作就会出现错误。list的底层是带头节点的双向循环链表,因此在list中进行插入的时候不会导致迭代器的失效,只有在删除的时候才会失效,因为list的删除是释放该节点,此时对应的迭代器指向的空间是无效的。
这里还要注意一点,失效的只是被删除节点的迭代器,不会影响其他节点的迭代器。

在这里插入图片描述
例如上面这段代码,目的是像想删除list中的所有元素,但是在删除之前没有保留当前元素的下一个节点的位置,在删除之后进行加一就会导致野指针的访问,这是典型的迭代器失效。在这里插入图片描述
因此想要防止迭代器失效,就需要在删除节点之前,将该节点的下一个位置保存下来,及时更新迭代器。
在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:53:40  更:2021-10-12 23:53:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:48:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码