[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系列将是第一款使用这款新旗舰处理器的手机。 这不是小米第…

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机器人…

[最新教程]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;在…

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

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

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

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

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

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

骨传导耳机值不值得入手?五款运动好物骨传导耳机推荐!

开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势&#xff0c;开放式蓝牙耳机作为骨传导耳机&#xff0c;深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时&#xff0c;后挂式骨传导耳机都会收到一致好评。对于热爱运动的人士而言&#xff0c;高品质的骨传…

A800显卡驱动安装(使用deb安装)

重新安装显卡驱动&#xff0c;查阅了资料将过程记录如下&#xff1a; 1.下载deb安装包 打开nvidia官网查找对应的驱动版本&#xff0c;A800所在的选项卡位置如图&#xff1a; 点击查找后下载得到的是nvidia-driver-local-repo-ubuntu2004-550.90.07_1.0-1_amd64.deb安装包 2.…

UDS服务——RequestDownload(0x34)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍RequestDownload(0x34)—— 请求下载,用于给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起请求下载,以完成ECU程序的升级。通过阅读本文,希望能对你有所帮助。 文章目录 诊断协议那些事儿…

linux如何部署前端项目和安装nginx

要在Linux上部署前端项目并安装Nginx&#xff0c;你可以按照以下步骤操作&#xff1a; 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目&#xff0c;假设前…

萨科微slkor宋仕强论道华强北假货之六

萨科微slkor宋仕强论道华强北假货之六&#xff0c;华强北的假货这么多&#xff0c;搞得客户害怕、同行焦虑&#xff0c;话说“在华强北没有被坑过的&#xff0c;就不是华强北人”。我们金航标Kinghelm&#xff08;www.kinghelm.com.cn&#xff09;公司以前有一个贸易部&#xf…

45、基于深度学习的螃蟹性别分类(matlab)

1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别&#xff0c;从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备&#xff1a; 首先需要收集包…

【报错解决】引入@ComponentScan注解注册bean容器后,导致的接口404问题

引入ComponentScan注解注册bean容器后&#xff0c;导致的接口404问题 背景 由于微服务开发中&#xff0c;经常需要在公共模块在引入一些公共模块&#xff0c;供其他服务使用&#xff0c;但是其他服务需要在启动类中配置ComponentScan注解扫描这个公共模块下注册的 bean&#…

在下游市场需求带动下 我国气调包装机市场规模逐渐扩大

在下游市场需求带动下 我国气调包装机市场规模逐渐扩大 气调包装机又称为气调保鲜包装机&#xff0c;是一种具有气体置换功能的保鲜包装设备。气调包装机的工作原理是将原有的包装内空气抽至真空&#xff0c;再充入一定配比的混合气体&#xff0c;从而对被包装的物品进行有效保…

python-爬虫篇-爬取百度贴吧,段友之家的图片和视频

#!/usr/bin/env python # -*- coding: utf-8 -*-""" 爬取百度贴吧&#xff0c;段友之家的图片和视频 author: cuizy time&#xff1a;2018-05-19 """import requests import bs4 import osdef write_file(file_url, file_type):""&quo…