【C++ STL学习之四】容器list深入学习

2023-11-07

一、list基础

List使用一个双向链表来管理元素。图一显示了list的结构。


图一 list的结构

任何型别只要具备赋值和可拷贝两种性质,就可以作为list的元素。


二、list的功能

list的内部结构和vector和deque截然不同,在很多方面都表现不同:

1、list不支持随机存取。所及既不提供下表操作符,也不提供at()函数。

2、任何位置上插入元素删除元素都很快。

3、插入和删除操作不会造成指向其他元素的pointers、references、iterators失效。

4、list对于异常的处理方式是:要么成功,要么什么都不发生。

5、不提供容量、空间重新分配等操作函数。

6、提供了一些函数专门用于移动元素。


三、list的操作函数

生成、赋值和销毁与序列式容器相同。

构造函数和析构函数:


非变动性操作


赋值


元素存取


一般来说,这些操作不会检查元素是否为空,所以程序员必须保证容器不为空。

迭代器相关函数

存取元素只能用迭代器。然而由于list不能随机存取,这些迭代器只是双向而非随机迭代器。所以凡是用到随机存取迭代器的算法(所有用来操作元素顺序的算法-特别是排序算法都归于此类)都不能调用。不过可以用list的成员函数sort()完成此功能。


元素的插入和删除



list提供deque的多余功能,还增加了remove()和remove_if()算法应用于list‘身上的特殊版本。这些成员函数比STL的remove算法更快,因为它们只进行内部指目标工作,无需估计元素。

要将所有与某值相等的元素删除,可以用如下语句(注意:确实是将这些元素删除了,而不是像vector那样只是某种移动而已)

list<int> list1;
list1.remove(val);
list还提供了其他一些成员函数,用来改变元素和区间的次序,或是重新串链。我们可以用他们来移动单一list里的元素,也可以移动两个list之间的元素(前提是list的型别一致)。



四、list的异常处理

在所有的STL标准容器中,list提供了最佳支持。几乎所有的操作都是要么正确,要么什么都不发生。只有少数几个操作没有这样的保证:赋值和sort()。不过他们也不会泄露资源,也不会与容器的恒常特性发生冲突。merge(),remove(),remove_if(),unique()提供的保证是有前提的L就是元素间的比较动作不会抛出异常。


五、list示例程序

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

void outputLists(const list<int> &l1,const list<int> &l2)
{
	cout << "list1:";
	copy(l1.begin(),l1.end(),ostream_iterator<int>(cout," "));
	cout << endl << "list2:";
	copy(l2.begin(),l2.end(),ostream_iterator<int>(cout," "));
	cout << endl << endl;
}

int main()
{
	list<int> iList1,iList2,iList3;

	for (int i = 1;i < 9;++i)
	{
		iList1.push_back(i);
		iList2.push_front(i);
		iList3.push_front(i);
	}

	outputLists(iList1,iList2);

	iList2.splice(iList2.end(),iList2,iList2.begin());
	outputLists(iList1,iList2);

	iList2.sort();
	outputLists(iList1,iList2);

	iList2.unique();
	outputLists(iList1,iList2);

	iList1.merge(iList2);
	outputLists(iList1,iList2);

	/*outputLists(iList3,iList1);
	iList1.merge(iList3);
	outputLists(iList3,iList1);*/
}
运行结果:

注意:merge只使用与合并两个元素已序(而且都是升序)排列的的容器。如上面的程序,最后merge ilist1和ilist3程序就会报错。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++ STL学习之四】容器list深入学习 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 【Java笔记+踩坑】SSM整合

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 SSM整合入门案例 图书的增删改查 1 1
  • ebtables介绍

    ebtables是与iptables类似的命令 区别在于ebtables用于对以太网帧的过滤 iptables用于对ip数据包的过滤 过滤流程见图 原图来源于 http blog csdn net wuruixn article detai
  • 力扣刷题——数组(2)

    将每个元素替换为右侧最大元素 给你一个数组 arr 请你将每个元素用它右边最大的元素替换 如果是最后一个元素 用 1 替换 完成所有替换操作后 请你返回这个数组 示例 输入 arr 17 18 5 4 6 1 输出 18 6 6 6 1 1
  • 网络基础:ACL与NAT

    目录 一 理论 1 ACL 2 NAT 二 实验 1 基础ACL 2 高级ACL 3 静态NAT 4 Easy IP 一 理论 1 ACL 1 ACL ACL 是Access Control List的简写 中文名称叫做 访问控制列表 它是
  • 面向对象设计原则——合成复用原则

    合成复用原则又称为组合 聚合复用原则 Composition Aggregate Reuse Principle C ARP 定义 尽量使用对象组合 而不是继承来达到复用的目的 合成复用原则就是在一个新的对象里通过关联关系 包括组合关系和聚
  • nRF52832 — Keil中如何配置RAM地址

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的
  • 1.新建按钮,窗口,按钮移动

    include my widget 01first project h include
  • IMU监测髋关节术后康复状况

    髋关节置换手术是一种用于治疗磨损导致的关节炎的针对性手术 为许多忍受长期疼痛和失去活动能力的患者带来了新生 2020年 在美国进行的所有初级和修正全髋关节置换术中 分别有约10 和20 的手术使用了双动臼杯 DM 因为与传统的单动关节相比
  • java环境的配置,下载jdK安装及安装

    1 java环境的配置下载jdK安装 2 jdk exe会解析两个文件jdk文件 jre文件 安装步骤 1 JDK jdk1 7 0 75 windows x64 exe 下载 选择 Accept License Agreement 根据系
  • RN开发系列<8>--Redux(1)入门篇

    1 Redux的基本用法 前言 说明 本文只针对移动端的Redux的基本用法进行描述 希望这一篇文章 就能帮助你搞定redux的基本用法 甚至不用再去查阅其他文档 因为我个人脑子比较笨 查阅了很多文档 看了不少视频资料才理解了 2 原理阐述
  • Python 使用函数作为返回值

    视频版教程 Python3零基础7天入门实战视频教程 Python还支持使用函数作为其他函数的返回值 def test bol if bol return add else return sub def add x y return x y
  • 基于Proteus的四位数码管显示

    1实验原理 P0口接断码线 P2口低四位接位选线 第一位数码管的位选线由P2 0来控制 第二位数码管的位选线由P2 1来控制 依次类推 由此可知可以控制P2 0到p2 3引脚 从而控制这个数码管哪一位来显示字符 而通过控制P0口输出断码值来
  • 单片机延时函数实现

    在编写单片机程序时 我们经常要用到延时函数 记得我们在学51单片机时 第一个延时是通过软件延时来实现的 代码如下 void delay volatile uint32 t cnt volatile uint32 t i 0 volatile
  • azkban设置重试不起作用,且有的任务一直running,无日志

    job脚本 foo job type command command su olc pro c bash app script python common file pymain sh coupon user active py retri
  • Python提取整数各个位的数字

    个位 XXX 1 10 十位 XXX 10 10 百位 XXX 100 10 千位 XXX 1000 10 万位 XXX 10000 10 1399 统计最大组的数目 LeetCode https leetcode cn com probl
  • 蓝桥杯Python-2n皇后问题(和别人的想法有点不一样)

    首先附上问题链接 蓝桥杯基础练习VIP 2n皇后问题 C语言网 dotcpp com 问题描述 给定一个n n的棋盘 棋盘中有一些位置不能放皇后 现在要向棋盘中放入n个黑皇后和n个白皇后 使任意的两个黑皇后都不在同一行 同一列或同一条对角线
  • 1034:计算三角形面积

    1034 计算三角形面积 时间限制 1000 ms 内存限制 65536 KB 提交数 52442 通过数 16079 题目描述 平面上有一个三角形 它的三个顶点坐标分别为 x1 y1 x2 y2 x3 y3 那么请问这个三角形的面积是多少
  • VMware Workstation 安装Vmware tools 是 出现vmware tools unavailable

    这个问题是因为虚拟机安装的时候操作系统选择的不对 在Virtual Machine Settings中选择Options 在General中选择正确的操作系统类型 例如Guest operating system 选择Linux Versi
  • vue-cli3使用百度富文本编辑器

    一 安装依赖 npm i vue ueditor wrap 或者 yarn add vue ueditor wrap 二 下载ueditor并将其复制到Static目录下 如图所示 三 引入VueUeditorWrap组件 import V
  • 【C++ STL学习之四】容器list深入学习

    一 list基础 List使用一个双向链表来管理元素 图一显示了list的结构 图一 list的结构 任何型别只要具备赋值和可拷贝两种性质 就可以作为list的元素 二 list的功能 list的内部结构和vector和deque截然不同