[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()



完~

未经作者同意禁止转载 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米15系列将首发骁龙8 Gen4 SoC

高通已确认2024年骁龙峰会定于10月21日举行。在这次峰会中高通将推出其最新的移动芯片Snapdragon 8 Gen4 SoC。著名科技博主DigitalChatStation今天证实&#xff0c;骁龙8 Gen4将以小米15系列首次亮相。这意味着小米15系列将是第一款使用这款新旗舰处理器的手机。 这不是小米第…

ChatTTS 推荐及使用说明

**项目名称&#xff1a;ChatTTS**  ChatTTS是一个基于Python的自然语言处理项目&#xff0c;它提供了一个语音合成模型&#xff0c;可以将文本转换为语音。这个模型使用了一种叫做Tacotron的深度学习模型&#xff0c;它可以将文本转换为流畅的语音。  **项目介绍**&#xf…

题解:CF1019D Large Triangle

题意 给定 n n n 个平面上的点&#xff0c;求是否存在 3 3 3 个点使得它们组成的三角形面积为 S S S。需要输出三个点的坐标。 n ≤ 2000 n\le2000 n≤2000。 解法 暴力做法&#xff1a;枚举 3 3 3 个点&#xff0c;海伦公式判断面积是否相等。复杂度 O ( n 3 ) O(n^3) O…

C++ 编程技巧分享

侯捷 C 学习路径&#xff1a;面向对象的高级编程 -> STL库 -> C11新特性 -> cmake 1.1. C 与 C的区别 在C语言中&#xff0c;主要存在两大类内容&#xff0c;数据和处理数据的函数&#xff0c;二者彼此分离&#xff0c;是多对多的关系。不同的函数可以调用同一个数据…

小i机器人:总负债5.31亿,员工数量在减少,银行借款在增加,净利润已下降-362.68%

小i机器人:总负债5.31亿,员工数量在减少,银行借款在增加,总收入在增长,净利润已下降-362.68% 来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 目录 一、小i机器人公司介绍 二、小i机器人过去20年的发展历程和取得的成就 三、小i机器人的产品和技术架构 四、小i机器人…

066、Python 关于Lambda函数

Lambda函数是一种小型、匿名的函数&#xff0c;也称为匿名函数。它们可以在代码中用作一次性的、简单的函数。lambda函数可以接受任意数量的参数&#xff0c;但只能包含一个表达式。lambda函数的语法比较简洁&#xff0c;通常用于需要一个简单函数的地方&#xff0c;而不需要为…

[最新教程]Claude Sonnet 3.5注册方法详细步骤分享,新手小白收藏,文末免费送已注册的Claude账号

一.Claude sonnet 3.5大模型面世 6月21日&#xff0c;被称为“OpenAI 最强竞对”的大模型公司 Anthropic 发布了 Claude 3.5 系列模型中的第一个版本——Claude 3.5 Sonnet。 Anthropic 在官方博客中表示&#xff0c;Claude 3.5 Sonnet 提高了智能化的行业标准&#xff0c;在…

数据分析的数学概念

众数-数据集中趋势 众数&#xff08;Mode&#xff09;是指在一组数据中出现次数最多的数值&#xff0c;它是描述数据集中趋势的一种方法&#xff0c;众数并不一定代表数据的一般水平。众数可以是数据集中的一个值&#xff0c;也可以是多个值&#xff0c;这取决于数据集的分布情…

基于卷积神经网络的目标检测

卷积神经网络基础知识 1.什么是filter 通常一个6x6的灰度图像&#xff0c;构造一个3*3的矩阵&#xff0c;在卷积神经网络中称之为filter,对&#xff16;x6的图像进行卷积运算。 2.什么是padding 假设输出图像大小为nn与过滤器大小为ff&#xff0c;输出图像大小则为(n−f1)∗(…

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程&#xff0c;涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略&#xff1a; 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…

【计算机毕业设计】204基于微信小程序疫情期间学生请假与销假系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

DDei在线设计器-API-DDeiFile

DDeiFile DDeiFile是代表一个设计文件&#xff0c;一个文件含有多个DDeiSheet(页签)。   DDeiFile实例包含了一个文件的所有数据&#xff0c;在获取后可以通过它访问其他内容。DDeiEditor中的files属性记录了当前打开的文件列表。 一个DDeiEditor实例至少包含一个DDeiFile实例…

同一天里,两位大厂程序员猝死。。。

2024年&#xff0c;真的不是平静的一年。在几天前&#xff0c;IT行业接连发生了两件不幸的事情。 6月17日下午&#xff0c;东南亚电商公司Sh**ee位于北京的研发中心&#xff0c;一位负责研发的女员工突然在工位上晕倒。 同事们赶紧拨打了120&#xff0c;然而还是没能抢救过来&a…

Go 使用sync.Mutex或sync.RWMutex进行并发安全访问

一、使用sync.Mutex或sync.RWMutex进行并发安全访问 当多个协程并发访问共享数据时&#xff0c;需要确保数据访问的安全性。sync.Mutex和sync.RWMutex提供了互斥锁和读写锁&#xff0c;用于在访问共享资源之前进行锁定&#xff0c;以避免数据竞争。 sync.Mutex package main…

谈【AI在创造还是在毁掉音乐】

AI在创造音乐方面确实具有极大的潜力&#xff0c;但从长远来看&#xff0c;它更有可能毁掉音乐。 首先&#xff0c;AI生成的音乐缺乏情感和灵感。音乐是一种表达情感和思想的艺术形式&#xff0c;而AI只是通过算法分析和模仿已有的音乐来生成新的作品。它缺乏创造力和独特性&a…

【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。

【验证码识别】Yolov8实战某验3空间推理点选验证码&#xff0c;目标检测&#xff0c;语义分割&#xff0c;颜色分类。 文章目录 【验证码识别】Yolov8实战某验3空间推理点选验证码&#xff0c;目标检测&#xff0c;语义分割&#xff0c;颜色分类。声明1.空间推理验证码&#xf…

2024年全国青少信息素养大赛python编程复赛集训第四天编程题分享

整理资料不容易,感谢各位大佬给个点赞和分享吧,谢谢 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数…

Studying-代码随想录训练营day17| 654.最大二叉树、617合并二叉树、700.二叉搜索树中的搜索、98.验证二叉树搜索树

第十七天&#xff0c;二叉树part05&#xff0c;进一步学习二叉树&#x1f4aa; 654.最大二叉树 文档讲解&#xff1a;代码随想录最大二叉树 视频讲解&#xff1a;手撕最大二叉树 题目&#xff1a; 学习&#xff1a;本题与利用中序和后序序列构造二叉树有相同之处。依据题目要求…

第五篇:构建与维护私有Docker Registry: 企业级实践指南

构建与维护私有Docker Registry: 企业级实践指南 1. 引言&#xff1a;解析私有Docker仓库的必要性 1.1 Docker Registry简介与私有化的好处 Docker Registry是一个用于存储和分发Docker镜像的系统。在Docker生态系统中&#xff0c;Registry扮演着至关重要的角色&#xff0c;为…

洛谷:P5714 【深基3.例7】肥胖问题

1. 题目链接 https://www.luogu.com.cn/problem/P5714 P5714 【深基3.例7】肥胖问题 2. 题目描述 题目描述&#xff1a;BMI计算:m / (h * h)&#xff0c;m是体重(kg)&#xff0c;h是身高(m) 小于18.5&#xff1a;体重国轻&#xff0c;Underweight 小于等于18.5且小于24&#…