C++STL之list的使用详解

news2024/9/23 11:25:48

一、简介

1、底层:list为双向链表,即struct中包含一个数据和两个指针,分别指向前一个节点和后一个节点,在堆上分配空间,每插入一个元数都会分配空间,每删除一个元素都会释放空间

2、性能

① 访问:随机访问性能很差,只能快速访问头尾节点

② 插入:很快,一般是常数开销

③ 删除:很快,一般是常数开销

3、适用场景:list 拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用 list

二、list的基本操作

1、初始化

#include<iostream>
#include<map>
#include<string>
#include<list>
using namespace std;
int main()
{
    std::list<int> my_list; // 构造空链表
    my_list.push_back(1); // 尾部插入数据1
    my_list.push_back(2); // 尾部插入数据2
    my_list.push_back(3); // 尾部插入数据3

    std::list<int> my_list1(3, 5); // 构造3个5的链表

    std::list<int> my_list2(my_list1.begin(), my_list1.end()); // 拷贝构造
}

2、插入数据

① push_front() 头部插入元素

push_front()函数用于将一个新的元素插入到链表的开头位置, 时间复杂度为O(1)。在双向链表中插入元素到开头位置的操作只涉及指针的重新链接,不需要移动其他元素

my_list.push_front(0); // 头插数据0
② push_back() 尾部插入元素

push_back()函数用于将一个新的元素插入到链表尾部, 时间复杂度为O(1)

my_list.push_back(4);
③ insert() 插入元素

insert()函数在 position 位置中插入值为val的元素。

插入单个数据。第一个参数为迭代器,即插入的位置,第二个参数是插入的数据。

// 尾部插入元素5
my_list.insert(my_list.end(), 5);

插入多个相同数据。第一个参数为迭代器,即插入的位置,第二个参数是插入的数据个数,第三个参数是插入的数据。

// 在尾部插入2个6
my_list.insert(my_list.end(), 2, 6);

插入多个数据。第一个参数为迭代器,即插入的位置,第二个参数是迭代器,需要插入元素初始位置,第三个参数是迭代器,需要插入元素的结束位置

/* 在my_list尾部插入3个5 */
std::list<int> my_list1(3, 5); // 构造3个5的链表
my_list.insert(my_list.end(), my_list1.begin(), my_list1.end());

3、删除数据

① pop_front() 头删元素

pop_front()函数用于删除链表中的第一个元素,时间复杂度为O(1)

my_list.pop_front();
② pop_back() 尾删元素
my_list.pop_back();
③ erase()删除数据

erase()函数用于删除链表中数据, 返回值是当前删除元素位置的下一个迭代器。

删除单个元素,参数为迭代器。

list<int>::iterator pos = my_list.begin(); // 第一个元素为0
if (pos != my_list.end())
{
    auto it = my_list.erase(pos);
    std::cout << "next: " << *it << std::endl; // 当前第一个元素为1
}

删除多个元素,两个参数均为迭代器,分别为初始位置和结束位置。

my_list.erase(my_list.begin(), my_list.end());
④ clear() 删除所有数据
my_list.clear();
⑤ remove() 删除元素

从list中删除元素,remove(val) 删除所有为val的元素

4、修改数据

① assign() 替换/赋值

assign(n,val); 

将当前列表中所有元素替换为n个T类型的val

my_list.assign(6, 1);

assign(l2.begin(),l2.end());

将12列表中的从l2.begin()到l2.end()之间的数值赋值给当前列表l1

my_list.assign(my_list1.begin(), my_list1.end());
② swap() 交换

交换两个链表数据,两种用法均可。

my_list.swap(my_list1);
swap(my_list, my_list1);
③ reverse() 反转

反转链表中数据。

my_list.reverse();
④ merge() 合并

l1.merge(l2); 默认升序

l1.merge(l2,greater<int>()); 升序排序

l1.merge(l2,less<int>()); 降序排序

合并两个链表。调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序

my_list.merge(my_list1);
⑤ resize() 

调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除。如果n比list原来的长度长,那么默认超出的部分元素置为0。

my_list.resize(2); // 大小修改为2个元素,多的元素删除

也可以用resize(n, m)的方式将超出的部分赋值为m。

my_list.resize(10, 0); // 大小修改为10个元素,多的赋值为0

5、查找数据

① front() 获取头部元素
my_list.front();
② back() 获取尾部元素
my_list.back();
③ 迭代器
for (auto const& v : my_list)
{
    std::cout << "v:" << v << std::endl;
}

6、其他用法

① sort() 排序

sort函数用于排序,默认升序

my_list.sort();
② size() 获取大小
int size = my_list.size();
③ unique() 去重

去重就是对该链表对象进行遍历,将元素值相同的多个元素进行删除,只保留唯一一个值节点

my_list.unique();

ok,今天分享就到这里了。

如果觉得分享对你有所帮助的话,记得点赞哦!

主页还有其他相关文章,欢迎一起学习,一起进步~

 

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

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

相关文章

C++语言学习(八)—— 继承、派生与多态(二)

目录 一、多继承 1.1 多继承中的二义性问题 1.2 虚基类 二、多态 2.1 静态绑定与静态多态 2.2 动态绑定与动态多态 三、运算符重载 3.1 重载、- -运算符 3.2 重载赋值运算符 3.3 重载输出流<<、输入流>>运算符 3.3.1 重载输出流&#xff08;<<&am…

VirtualBox下安装Centos7.9虚拟机的踩坑记录

目录 0 背景1 安装Centos7.91.1 下载iso镜像1.2 正常安装虚拟机1.3 将用户添加到sudoers并免密1.4 更新yum源1.5 配置静态IP1.6 通过ssh工具传文件1.7 总结 0 背景 最近搞了个便宜的低配台式机用来敲代码&#xff0c;主要是嫌弃笔记本屏幕太小了&#xff0c;想用个大屏。 然后我…

129页《战略推演:获取竞争优势的思维与方法》

知识星球APP搜索【战略咨询文库】&#xff0c;下载700多份资料 一、战略思维 差异化战略 产品或服务差异化&#xff1a;通过提供独特的产品特性、功能、设计或品质&#xff0c;满足特定客户群体的需求&#xff0c;从而与竞争对手区分开来。例如&#xff0c;苹果公司以其创新…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 &#xff08;简单&#xff09; 2.移除元素 &#xff08;简单&#xff09; 3.删除有序数组中的重复项 &#xff08;简单&#xff09; 4.删除有序数组中的重复项 II&#xff08;中等&#xff09; 5.多数元素&#xff08;简单&am…

数据结构与算法的实现与优化

目录 引言 数据结构与算法的重要性 实现与优化的基本原则 线性表的实现 顺序表与链表的实现 静态链表与动态链表的对比 栈与队列的实现 顺序栈与链栈的实现 顺序队列、链队列、循环队列与双端队列的实现 高级树结构的实现 二叉树、平衡树与哈夫曼树的实现 图的实现…

SSRF——redis(未授权访问)①

本文介绍如何复现并利用Redis的未授权访问漏洞&#xff0c;以达到远程代码执行和获取系统权限的目的。Redis版本&#xff08;2.8&#xff09;&#xff0c;于Ubuntu环境下进行。 SSRF&#xff08;Server-Side Request Forgery&#xff09;是一种网络安全漏洞&#xff0c;允许攻击…

前端实现两张图片合成,图片换背景,简单p图程序

前言 最近在自己做一个图文工具网站&#xff0c;图片背景替换功能&#xff0c;后台通过opencv的AI算法抠出了图片主元素&#xff0c;现在需要把抠出来的元素换一个背景色&#xff0c;或者合成到一张背景图片中&#xff0c;如何操作呢&#xff1f; 实现方式Demo 我考虑的是…

linux系统使用 docker 来部署运行 mysql5.7 并配置 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

【解决问题】linux系统运行程序可以打印信息到屏幕,重定向到一个文件,文件中没有信息

在Linux系统中运行程序时&#xff0c;如果你发现程序打印的信息无法通过重定向写入到文件中&#xff0c;那么很可能是因为程序将信息打印到了标准错误流&#xff08;stderr&#xff09;&#xff0c;而不是标准输出流&#xff08;stdout&#xff09;。重定向操作通常只对标准输出…

20240826 每日AI必读资讯

突发&#xff01;IBM中国研发岗访问权限一夜关闭&#xff0c;千人或被裁 - IBM中国区一夜关闭了研发测试岗员工的内部权限&#xff0c;波及1000多名员工。 - 今年3月&#xff0c;IBM大中华区董事长陈旭东在媒体及分析师沟通会上表示&#xff0c;公司在IBM大中华区的战略将聚焦…

《重生到现代之从零开始的C语言生活》—— 指针4

字符指针变量 在指针类型中我们知道有一种指针类型为字符指针char* 如果我们想用他 int main() {char p w;char *d &p;return 0; }他可以存放字符变量的地址 也可以这么使用 int main() {char *d "hello"return 0 ; }其本质是把字符串"hello"的…

动态链接库——深入探讨C++程序中.so技术细节和实现方式及C程序中动静态库的区别(+工程分步骤编译库)

在开发中&#xff0c;动态链接库&#xff08;DLL&#xff09;和共享对象&#xff08;Shared Object&#xff09;.so文件的使用成为提升程序灵活性和重用性的关键手段。如下相关工具&#xff0c;GNU Libtool: 一种用于创建可移植共享库的工具。Dynamic Linker: 关于动态链接器的…

VSCode - 终端使用 code 命令

1、Command Shift P 调出 输入 shell 选择 安装命令 2、授权 3、使用 % code --version 1.92.1 eaa41d57266683296de7d214f574d0c2652e1fc4 arm64% code ~/.zshrc 伊织 2024-08-21&#xff08;三&#xff09;

6.InnoDB引擎

InnoDB引擎 1.逻辑存储结构2.架构2.1内存架构2.2 磁盘结构 3.事务原理3.1 事务3.2 redo log3.3undo log 4.MVCC4.1MVCC 基本概率14.2 实现原理 1.逻辑存储结构 2.架构 2.1内存架构 2.2 磁盘结构 create tablespace mytest add datafile mytest.idb engineinnodb;后台线程 mys…

Ubuntu 24.04 上安装和配置 Zabbix Agent

Zabbix 是一个强大的开源监控工具&#xff0c;可以帮助您跟踪服务器&#xff0c;网络和应用程序。在主机环境中配置了 Zabbix Server 之后&#xff0c;下一步是添加用于监视的远程主机。Zabbix Agent 从您的服务器收集数据并将其发送到 Zabbix 服务器进行监控。 本指南将向您展…

CUDA-BEVFusion(1): 环境安装

文章目录 1. 查看ubantu配置2. 环境安装2.1 安装包下载2.1.1 tensorRT 下载2.1.2 CUDA 下载2.1.3 cuDNN 下载2.2 安装2.2.1 cuda 安装2.2.2 cuDNN 安装2.2.3 tensorRT安装3. 安装包下载1. 查看ubantu配置 查看GPU的版本sudo apt-get install pciutilslspci | grep VGA查看linux…

Tabby 终端工具推荐

前言:Tabby 是一个现代化的、跨平台的终端模拟器&#xff0c;旨在提供增强的用户体验和定制功能。Tabby&#xff08;以前称为 Terminus&#xff09;被设计为比传统终端更加灵活和美观 Eugeny/tabby: A terminal for a more modern age (github.com)https://github.com/Eugeny/…

网络安全售前入门02——产品了解

目录 1.前言 2.WEB应用防火墙介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 3.上网行为审计 3.1产品架构功能 3.2应用场景 3.3部署形式 3.4产品价值 3.5选型依据 后续 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我…

BUUCTF PWN wp--ciscn_2019_n_1

第一步 checksec&#xff0c;并检查该题的保护机制 该题的保护机制如下&#xff1a; Arch (架构): amd64-64-little 这意味着这个二进制文件是为64位AMD64架构编译的&#xff0c;使用小端序&#xff08;little-endian&#xff09;。RELRO (重定位-read-only): Partial RELRO P…

工具技巧:如何使用AutoDL算力云

AutoDL算力云可以快速构建编程环境&#xff0c;价格也很实惠 模型运行已知需要显存少&#xff0c;可以考虑选择4090&#xff0c;有24G&#xff0c;具体选择哪种类型&#xff0c;可以看看重点看看这两方面**&#xff1a;数据盘能否扩容&#xff0c;CUDA版本是否够高** 根据自身…