[C++ STL] list 详解

标题:[C++ STL] vector 详解

@水墨不写bug



 正文开始:

一、背景

        C语言阶段,我们如果想要使用链表,需要自己手动实现一个链表。这是非常低效的做法,C++中的STL中提供了链表“ list ”,我们在包含头文件 <list> 后就可以直接使用。

二、容器简介

        list是序列容器,允许在序列内的任何位置进行常量时间的插入和操作,以及两个方向的迭代。

        list容器被实现为双链表;双链表可以将它们包含的每个元素存储在不同且不相关的存储位置。排序是通过与前面元素的链接和后面元素的链接的每个元素的关联在内部保持的。

        它们与forward_list非常相似:主要区别在于forward_list对象是单链表,因此它只能向前迭代,但是更高效。

        与其他基本标准序列容器(array、vector和deque)相比,在已经得到迭代器的情况下,list在容器内的任何位置插入、提取和移动元素方面通常表现更好。因此 list 在大量使用这些操作的算法(如排序算法)中也表现更好。

        与其他序列容器相比,list和forward_list的主要缺点是它们无法通过位置直接访问元素;

三、容器接口

(1)默认成员函数

i,构造函数

default (1)
explicit list (const allocator_type& alloc = allocator_type());

默认构造,创建一个没有元素的空链表。

list<int> l1;
cout << l1.size() << endl;
//输出0,链表内默认没有任何元素

fill (2)
explicit list (size_type n);
list (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());

创建一个链表,有n个元素,并将这n个元素初始化为设定值val(如果没有设置,默认初始化为0)。

list<int> l1(5,1);
for (const auto e : l1)
	cout << e << " ";
cout << endl;

range (3)
template <class InputIterator>
list (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());

范围初始化,根据迭代器(也可以是其他类型迭代器)区间内的元素的值拷贝来初始化list:


	vector<int> v1={1,2,3,4,5};

	list<int> l1(v1.begin(), v1.end());
	for (const auto& e : l1)
		cout << e << " ";
	cout << endl;
    

ii,析构函数

~list();

        自动销毁实例化的链表,由编译器自动调用。

iii,拷贝构造

copy 
list (const list& x);
list (const list& x, const allocator_type& alloc);

在创建新对象时用已经存在的对象对它初始化:

list<int> l1 = { 5,6,8,9 };
list<int> l2(l1);
list<int> l3 = l1;

for (const auto& e : l2)
	cout << e << " ";
cout << endl;

for (const auto& e : l3)
	cout << e << " ";
cout << endl;

iv,赋值重载

copy (1)
list& operator= (const list& x);

实现两个list对象的赋值操作:

list<int> l1 = { 5,6,8,9 };
list<int> l2;
l2 = l1;

for (const auto& e : l2)
	cout << e << " ";
cout << endl;

(2)迭代器接口

i,begin()

iterator begin() noexcept;
const_iterator begin() const noexcept;

        返回一个指向列表容器中第一个元素的迭代器。普通对象调用普通函数,const对象调用const函数。

        注意,list::front返回对第一个元素的引用 ,此函数返回指向该元素的双向迭代器。如果容器为空,则返回的迭代器值不能被解引用。

ii,end()

 iterator end() noexcept;
const_iterator end() const noexcept;

        返回一个迭代器,该迭代器指向列表容器中经过末端的元素。

        由于返回的迭代器指向容器中最后一个元素的下一个位置(头节点)。它不含有任何有效数据,因此不能被解引用。

        由于标准库函数使用的范围不包括其end迭代器所指向的元素,因此该函数通常与list::begin结合使用,以指定包含容器中所有元素的范围。

        如果容器为空,该函数返回与list::begin相同的结果。

iii,rbegin()

   reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;

        返回指向最后一个元素的反向迭代器。

        反向迭代器反向迭代 : 自增它们将移动到容器的起始方向。

        rbegin指向成员end所指向的元素的前一个。注意,成员函数 list::back 返回最后一个元素的引用,而此函数返回指向最后一个元素的反向双向迭代器。

iv,rend()

   reverse_iterator rend() nothrow;
const_reverse_iterator rend() const nothrow;

        返回一个反向迭代器。

        该迭代器指向列表容器中第一个元素之前的理论元素(该元素被认为是其反向结束),list::rbegin和list::rend之间的范围包含容器的所有元素(以相反的顺序)。

v,cbegin()

const_iterator cbegin() const noexcept;

        begin的const版本,begin已经重载了一个const版本,起始即使不使用这个函数,也不会影响const迭代器的正常使用。

vi,cend()

        end的const版本,end已经重载了一个const版本,起始即使不使用这个函数,也不会影响const迭代器的正常使用。

vii,crbegin()

        rbegin的const版本, rbegin已经重载了一个const版本,起始即使不使用这个函数,也不会影响const迭代器的正常使用。

viii,crend()

        rend的const版本,rend已经重载了一个const版本,起始即使不使用这个函数,也不会影响const迭代器的正常使用。

(3)容量接口

i,empty()

        判断容器是否为空,为空返回真,否则返回假。

ii,size()

        

size_type size() const noexcept;

        返回list内元素的数量。

iii,max_size()

        

size_type max_size() const noexcept;

        返回理论上list可存储的最大数量,实际上不具有参考意义。

(4)元素获取

i,front()

      reference front();
const_reference front() const;

        返回list容器头一个元素的引用。

        成员函数 list::begin返回指向同一元素的迭代器,而此函数返回直接引用。在空容器上调用此函数会导致未定义行为。

ii,back()

 reference back();
const_reference back() const;

        返回list容器最后一个元素的引用。

        back是返回容器的最后一个元素的引用,而end是返回最后一个元素下一个位置(头节点)的迭代器。

        在空容器上调用此函数会导致未定义行为。

(5)修改

i,push_front()

void push_front (const value_type& val);

        在列表的开头插入一个新元素,就在它当前的第一个元素之前。val的内容被复制(或移动)到插入的元素中。这高效的将容器大小增加了1。

ii,pop_front()

void pop_front();

        删除列表容器中的第一个元素,高效地将其大小减小1。这将破坏被删除的元素。

iii,push_back()

void push_back (const value_type& val);

        在列表容器的最后一个当前元素之后,在其末尾添加一个新元素。val的内容被复制(或移动)到新元素中。这有效地将容器大小增加了1。

iv ,pop_back()

void pop_back();

        删除列表容器中的最后一个元素,有效地将容器大小减少一个。这将破坏被删除的元素。

v,insert()

single element (1)
iterator insert (const_iterator position, const value_type& val);

在迭代器position位置插入一个元素val,val如果传入int,则会通过构造函数进行隐式类型转换。(position是下标的值)


ostream& operator<<(ostream& out, list<int> l1)
{
	for (const auto& e : l1)
		cout << e<<" ";
	cout << endl;
	return out;
}

void test1()
{
	list<int> l1 = { 1,2,3,4 };
	list<int>::iterator it = l1.begin();
	l1.insert(it, 0);
	cout << l1;
}

fill (2)
iterator insert (const_iterator position, size_type n, const value_type& val);

在迭代器position位置插入n个val,如果传入int,则会通过构造函数进行隐式类型转换:


ostream& operator<<(ostream& out, list<int> l1)
{
	for (const auto& e : l1)
		cout << e<<" ";
	cout << endl;
	return out;
}

void test1()
{
	list<int> l1 = { 1,2,3,4 };
	list<int>::iterator it = l1.begin();
	l1.insert(it, 6,0);
	cout << l1;
}

range (3)
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);

通过另外一个容器的迭代器区间来初始化。

vi,erase()

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

        可以删除position位置的一个元素;

        也可以删除迭代器first和last(左闭右开)区间内的元素。

vii,swap()

        交换两个链表的内容:

        用x的内容交换容器的内容,x是另一个相同类型的list。大小可能不同。在调用this成员函数之后,this容器中的元素是调用之前在x中的元素,而x的元素是在this容器中的元素。

        所有迭代器、引用和指针对于交换后的对象仍然有效。(注意,存在一个具有相同名称的非成员函数,swap,用行为类似于该成员函数的优化重载该算法。)

viii,resize()

void resize (size_type n);
void resize (size_type n, const value_type& val);

        调整容器的大小,使其包含n个元素。

        如果n小于当前容器的大小,则内容将被减少到前n个元素,并删除超出的元素(并销毁它们)。

        如果n大于当前容器的大小,则通过在末尾插入所需的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将其进行值初始化。

        (注意,这个函数通过插入或删除元素来改变容器的实际内容)

ix,clear()

void clear() noexcept;

        从列表容器中删除所有元素(这些元素已被销毁),并将容器的大小保留为0。

(6)常见算法接口

i,splice()

entire list (1)
void splice (const_iterator position, list& x);
single element (2)
void splice (const_iterator position, list& x, const_iterator i);
element range (3)
void splice (const_iterator position, list& x,
             const_iterator first, const_iterator last);

ii,remove()

void remove (const value_type& val);

        删除具有特定值的元素;

        从容器中移除与val比较结果相等的所有元素。调用这些对象的析构函数,并按移除的元素数量减少容器大小。

iii,remove_if()

template <class Predicate>
  void remove_if (Predicate pred);

        去除满足条件的元素;

        从容器中移除Predicate pred返回true的所有元素。这将调用这些对象的析构函数,并根据删除的元素数量减少容器大小。

iv,merge()

(1)
  void merge (list& x);

        通过将列表中各自有序位置的所有元素转移到容器中(两个容器都必须已经有序),将x合并到列表中。

v,sort()

(1)
  void sort();

链表排序;

对列表中的元素进行排序,改变它们在容器中的位置。

vi,reverse()

void reverse() noexcept;

        链表逆置;

 

目录

一、背景

二、容器简介

三、容器接口

(1)默认成员函数

i,构造函数

ii,析构函数

iii,拷贝构造

iv,赋值重载

(2)迭代器接口

i,begin()

ii,end()

iii,rbegin()

iv,rend()

v,cbegin()

vi,cend()

vii,crbegin()

viii,crend()

(3)容量接口

i,empty()

ii,size()

iii,max_size()

(4)元素获取

i,front()

ii,back()

(5)修改

i,push_front()

ii,pop_front()

iii,push_back()

iv ,pop_back()

v,insert()

vi,erase()

vii,swap()

viii,resize()

ix,clear()

(6)常见算法接口

i,splice()

ii,remove()

iii,remove_if()

iv,merge()

v,sort()

vi,reverse()



完~

未经作者同意禁止转载 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/732777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见调试器介绍

目录 常见调试器 1.1 ST-Link 1.2 DAPLink 1.3 JLink 常见调试器 市面上有很多的调试器&#xff0c;下面是大家比较常见的一些调试器&#xff0c; 比如&#xff1a;ST-Link、DAPLink、JLink、Ulink等 1.1 ST-Link ST-Link是一种用于STM8及STM32系列单片机的调试器和下载…

STM32硬件接口I2C应用(基于FT6336)

目录 概述 1 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 1.3 MCU IO与Touch PIN对应关系 2 FT6336的寄存器 2.1 FT6336寄存器列表 2.2 寄存器功能介绍 3 STM32Cube控制配置I2C 3.1 软硬件版本信息 3.2 I2C参数配置 3.3 使用STM32Cube产生工程 4 HAL库…

用自己的数据集训练TimeSformer并转ONNX用c++推理

用自己的数据集训练TimeSformer并转ONNX用c++推理 文章目录 用自己的数据集训练TimeSformer并转ONNX用c++推理下载安装TimeSformer创建分类文件夹创建数据集修改训练配置运行脚本开始训练测试模型模型转为onnx测试一下生成的onnx模型转为用c++推理下载安装TimeSformer TimeSfo…

EasyRecovery数据恢复软件2024免费版下载

EasyRecovery数据恢复软件&#xff0c;是我在电脑使用过程中遇到的神器&#xff01;它不仅功能强大&#xff0c;操作简便&#xff0c;还帮我找回了丢失的重要文件。今天&#xff0c;我就来给大家分享一下我的使用体验和心得。 让我来介绍一下EasyRecovery的功能。这款软件可以恢…

qt开发-09_分裂器

QSplitter 是 Qt 框架中的一个非常实用的控件&#xff0c;用于创建可调整大小的窗格。它允许用户通过拖动子窗口间的边界&#xff08;也称为分割条&#xff09;来动态调整子窗口的尺寸。这在开发需要多个视图同时显示&#xff0c;且用户需要根据需要调整每个视图大小的应用程序…

内容安全复习 6 - 白帽子安全漏洞挖掘披露的法律风险

文章目录 安全漏洞的法律概念界定安全漏洞特征白帽子安全漏洞挖掘面临的法律风险“白帽子”安全漏洞挖掘的风险根源“白帽子”的主体边界授权行为边界关键结论 安全漏洞的法律概念界定 可以被利用来破坏所在系统的网络或信息安全的缺陷或错误&#xff1b;被利用的网络缺陷、错…

推荐4款实用工具,非常好用,建议收藏

PDFREAL PDFReal 是一个功能强大的在线PDF编辑工具&#xff0c;提供多种实用的PDF处理功能。用户可以在一个网站上完成包括PDF合并、PDF拆分、PDF压缩、PDF保护、PDF解锁等多种操作。此外&#xff0c;PDFReal 还支持将文本转换为PDF、将图片转换为PDF、添加水印、提取页面内容等…

【Springcloud微服务】Docker上篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Springcloud微服务 &#x1f320; 首发时间&#xff1a;2024年6月22日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f4…

Vue73-命名路由

一、路由的name属性 二、小结

Pyqt5 + Qt Creator实现QML开发环境配置

先安装Qt Creator, 该软件主要是为了编辑QML文件 在pycharm中配置外部插件&#xff0c;实现Qt Creator的调用 配置完成后&#xff0c;右击qml文件选择Qt Creator就可以直接进行编辑了

Nominatim免费的地址解析,逆地址解析,OpenStreetMap开源地图数据【全网最全】

视频学习地址 国内的一些地址解析供应商的API都开始付费了&#xff0c;就想找个免费的地址解析和逆地址解析的应用&#xff0c;最终选择了Nominatim OpenStreetMap 文章目录 一、选型1-1、数据源1-2、地理编码引擎2-1、初尝Nominatim2-1-1、地址解析2-1-2、逆地址解析 2-2、OS…

HarmonyOS角落里的知识—Stage模型应用程序

开发态包结构 在DevEco Studio上创建一个项目工程&#xff0c;并尝试创建多个不同类型的Module。根据实际工程中的目录对照本章节进行学习&#xff0c;可以有助于理解开发态的应用程序结构。 图1 项目工程结构示意图&#xff08;以实际为准&#xff09; 工程结构主要包含的文…

RabbitMQ —— 理解及应用场景

一、MQ相关的概念 RabbitMQ 是一种分布式消息中间件&#xff0c;消息中间件也称消息队列MQ&#xff0c;那么什么是MQ呢&#xff1f;请继续阅读下文。 1.1、MQ的基本概念 什么是MQ MQ(message queue)&#xff0c;从字面意思上看就个 FIFO 先入先出的队列&#xff0c;只不过队列…

工业互联网的独特UI风格

工业互联网的独特UI风格

纯血鸿蒙 璀璨星河

点击上方蓝字关注我&#xff0c;知识会给你力量 华为最近可谓是加班加点&#xff0c;前段时间华为给出了鸿蒙系统的计划表&#xff0c;让大家都摩拳擦掌&#xff0c;想看看华为到底有几把刷子&#xff0c;这次的621HDC大会&#xff0c;就是华为给全世界的第一个交待。 最近在网…

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品

锂磷硫&#xff08;LPS&#xff09;属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫&#xff08;LPS&#xff09;&#xff0c;为非晶态材料&#xff0c;是硫化物固态电解质代表性产品之一&#xff0c;具有热稳定性好、成本较低等优点&#xff0c;在固态电解质中离子电导率较…

外卖APP开发详解:从同城O2O系统源码开始

近期&#xff0c;从事软件开发的小伙伴们都在讨论外卖APP&#xff0c;热度非常之高&#xff0c;所以小编今天将与大家一同探讨同城O2O系统源码、外卖APP开发。 一、外卖APP开发的前期准备 了解目标用户的需求&#xff0c;分析竞争对手的优劣势&#xff0c;明确自身的市场定位。…

Excel 导入实例

在上一节的基础上&#xff0c;本文演示下如何导入excel数据。 Excel导入操作指导 继承ocean-easyexcel SDK&#xff0c;上一节打包生成 <dependency><groupId>com.angel.ocean</groupId><artifactId>ocean-easyexcel</artifactId><version…

VB验证密码

在文本框中输入密码&#xff0c;“验证密码”按钮检验输入的是否为“123456”。“清空”按钮清空文本框。“结束”按钮关闭窗体。 Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim P$P Trim(TextBox1.Text)If P &…

第13章.创建MDK工程-基于标准库版

目录 0. 《STM32单片机自学教程》专栏 13.1 新建本地工程文件夹 13.2 新建工程 13.2.1 新建工程 13.2.2 新建组 13.2-3 添加文件 13.3 配置魔术棒选项卡 13.3.1 Output 选项卡 13.3.2 C/C选项配置 13.3.3 Dubug选项配置 13.4 使用标准库点亮LED 参考资料&#xff1…