C++容器系列之list详解与应用

C++容器系列之list详解与应用

  • 引言
  • list的元素排列特性
  • 优缺点
  • 与其他容器的区别
  • 应用场景
  • 常见函数
  • 代码示例

引言

C++标准模板库(STL)提供了丰富的容器类,其中之一就是list。list是一个双向链表实现的容器,与数组和向量等容器有很大的区别。本文将详细介绍list的元素排列特性、与其他容器的区别、应用场景,并提供代码示例。

list的元素排列特性

list是一个双向链表,因此其元素在内存中并不是连续存储的,而是通过指针进行连接。这使得在插入和删除操作上具有高效性能,但在随机访问上相对较慢。

优缺点

优点:
高效的插入和删除操作: 由于链表的结构,插入和删除元素只需调整相邻节点的指针,无需移动大量元素。
不需要预先分配内存: 相比于数组和向量,list不需要预先分配一块连续的内存空间。
缺点:
随机访问相对较慢: 由于链表的结构,访问元素时需要从头节点或尾节点开始逐个遍历,时间复杂度为O(n)。

与其他容器的区别

与向量(vector)的区别:
内存分配方式: vector使用动态数组,元素在内存中是连续存储的,而list使用链表,元素是通过指针连接的。
插入和删除操作: 在vector中,插入和删除元素可能涉及到大量元素的移动,而list插入和删除操作仅需要调整指针,因此更高效。
与队列(queue)的区别:
元素访问: queue是一个先进先出(FIFO)的数据结构,只能在队列的两端进行元素的插入和删除,而list可以在任意位置插入和删除元素。
与双端队列(deque)的区别:
中间插入和删除操作: 与deque相比,list更适合在中间插入和删除元素,因为在list中这些操作是高效的,而在deque中涉及到元素的移动。

应用场景

list适用于以下场景:

  • 频繁的插入和删除操作: 当程序中需要频繁执行插入和删除操作,而不关心随机访问时,list是一个不错的选择。
  • 不需要随机访问的情况: 如果算法或数据结构的特性不要求随机访问,使用list可以获得更好的性能。
  • 中间插入和删除较多的情况: 如果需要在容器的中间位置进行大量插入和删除操作,list通常比其他容器更为高效。

常见函数

以下是C++中std::list类的一些常见函数用法:

构造和赋值:

构造函数:

std::list<int> myList;  // 创建一个空的list
std::list<int> myList2(5, 10);  // 创建包含5个值为10的元素的list

赋值操作:


std::list<int> anotherList = {1, 2, 3};
myList = anotherList;  // 赋值操作

插入和删除操作:

插入元素:


myList.push_back(4);      // 在末尾插入元素
myList.push_front(0);     // 在开头插入元素
auto it = myList.begin();  
++it;
myList.insert(it, 2);     // 在指定位置插入元素

删除元素:


myList.pop_back();         // 删除末尾元素
myList.pop_front();        // 删除开头元素
auto it = myList.begin();
++it;
myList.erase(it);          // 删除指定位置的元素

访问元素:

通过迭代器访问:


for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";
}

通过范围-based for 循环:


for (const auto& element : myList) {std::cout << element << " ";
}

容量:

大小:


std::cout << "Size of the list: " << myList.size() << std::endl;

检查是否为空:


if (myList.empty()) {std::cout << "List is empty." << std::endl;
}

修改容器:

清空:


myList.clear();  // 清空所有元素

其他操作:

反转:


myList.reverse();  // 反转list中的元素

排序:


myList.sort();  // 默认升序排序
// 若要降序排序,可以使用自定义比较函数
myList.sort(std::greater<int>());

这些是std::list类的一些基本函数用法。在实际使用时,可以根据具体需求选择合适的操作。

代码示例

下面是一个简单的C++代码示例,演示了如何使用list进行基本操作:

#include <iostream>
#include <list>int main() {// 创建liststd::list<int> myList;// 在末尾插入元素myList.push_back(1);myList.push_back(2);myList.push_back(3);// 在开头插入元素myList.push_front(0);// 遍历liststd::cout << "Elements in the list: ";for (const auto& element : myList) {std::cout << element << " ";}std::cout << std::endl;// 删除第二个元素auto it = std::next(myList.begin(), 1);myList.erase(it);// 遍历修改后的liststd::cout << "Elements after erasing the second element: ";for (const auto& element : myList) {std::cout << element << " ";}std::cout << std::endl;return 0;
}

这个示例展示了如何创建list、插入和删除元素,以及遍历list。

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

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

相关文章

RT-DETR核心结构改进:即插即用 | 集成YOLO-MS论文SOTA核心结构,原汁原味RT-DETR改进升级版,打破性能瓶颈

💡本篇内容:RT-DETR核心结构改进:即插即用 | 集成YOLO-MS论文SOTA核心结构,原汁原味RT-DETR改进升级版,打破性能瓶颈 💡🚀🚀🚀本博客 改进源代码改进 适用于 RT-DETR 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新, 该专栏专注于RT-DE…

一文了解 Go 接口

如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出 接口 在 Go 语言中&#xff0c;接口是一种抽象的类型&#xff0c;是一组方法的集合…

react中使用ref属性获取元素,并判断该元素内是否含有子元素

在react中&#xff0c;可以使用ref属性来获取到一个元素的引用&#xff0c;然后再使用ref.current来访问该元素的DOM节点&#xff0c;使用DOM API来判断这个元素是否含有子元素&#xff0c;要判断一个元素是否含有子元素&#xff0c;可以使用hasChildNodes()&#xff0c;其返回…

Salesforce×阿里云,影响几何?

实际上&#xff0c;从这个视角来看&#xff0c;Salesforce和阿里云的合作也恰在成为着这个市场的一个新催化剂。“期待Salesforce能给中国市场带来一些新的增量&#xff0c;包括对合作伙伴的态度&#xff0c;对产品的态度等等。”一位CRM相关人士告诉我们。 那么&#xff0c;阿…

slurm 23.11.0集群 debian 11.5 安装

slurm 23.11.0集群 debian 11.5 安装 用途 Slurm(Simple Linux Utility for Resource Management&#xff0c; http://slurm.schedmd.com/ )是开源的、具有容错性和高度可扩展的Linux集群超级计算系统资源管理和作业调度系统。超级计算系统可利用Slurm对资源和作业进行管理&a…

【Jmeter】Jmeter基础4-Jmeter元件介绍之监听器

2.4、监听器 监听器主要用于收集、统计、查看和分析结果。 2.4.1、察看结果树 作用&#xff1a;查看取样器请求和响应结果&#xff0c;包括消息头&#xff0c;请求的数据&#xff0c;响应的数据等。一般在调试时才用&#xff0c;在实际运行压测时建议禁用&#xff0c;因为大量…

【NSX-T】6. 搭建NSX-T环境 —— 配置 Segment 网段

目录 6. 配置 SegmentLab 说明6.1 创建 Segment&#xff08;1&#xff09;创建 Web-Segment&#xff08;2&#xff09;创建 App-Segment 和 DB-SegmentApp-SegmentDB-Segment 6.2 验证 Segment&#xff08;1&#xff09;在 NSX Manager中查看&#xff08;2&#xff09;在vSpher…

前端走向未来:真相还是焦虑的贩卖?

目录 一、为什么会出现“前端已死”的言论 二、你如何看待“前端已死” 三、前端技术的未来发展趋势 四、前端人&#xff0c;该如何打好这场职位突围战&#xff1f; 我的其他博客 一、为什么会出现“前端已死”的言论 近来&#xff0c;IT圈内流传着“Java 已死、前端已凉”…

阿里云服务器环境配置,ssh免密登录和配置docker

此文章适合ubuntu20.04 64位和ubuntu22.04 64位版本 一.登陆服务器 租完服务器后&#xff0c;首选需要使用本地gitbash或者cmd进入服务器&#xff0c; 命令&#xff1a; ssh rootxxx xxx为服务器公网ip&#xff0c;然后yes&#xff0c;然后输入密码就会进入自己的服务器&am…

医院污水处理设备远程监控超标报警解决方案

行业背景 近年来&#xff0c;我国医疗机构建设得到了巨大的发展。根据《2022年我国卫生健康事业发展统计公报》&#xff0c;2022年末&#xff0c;全国医疗卫生机构总数达1032918个。截至2022年10月&#xff0c;根据全国排污许可证管理信息平台&#xff0c;共有 13316家医院核发…

修改Docker0和容器的地址

修改Docker0和容器的地址 1. 需求 默认服务器安装完Docker-ce后会给docker0分配172.17.0.1/16地址. 公司新接入一个网段正好与172.17.0.1/16冲突,此时访问这台服务器的容器时就会发生网络不可达. 2. 解决方法 修改/etc/docker/daemon.json 加入一个自定义网段 vim /etc/d…

想要在电脑桌面上使用手机便签怎么操作?

作为一名上班族&#xff0c;我们时常需要在电脑和手机之间同步使用便签&#xff0c;以记录工作、生活中的重要事项。然而&#xff0c;有些时候我们可能更习惯在手机上使用便签&#xff0c;但又希望在电脑桌面上也能够方便地查看和编辑这些便签。那么&#xff0c;如何在电脑桌面…

python 内置数据结构

python内置的数据结构有&#xff1a; 列表(list) 元组(tuple) 字典(dict) 集合(set) 在python语言中&#xff0c;以上4种数据结构和基础数据类型&#xff08;整数、浮点数等&#xff09;统称为“内置类型”&#xff08;Built-in Types&#xff09;。 1. 列表(list) 参考&…

k8s-8 ingress

ExternalName类型 当集群外的资源往集群内迁移时&#xff0c;地址并不稳定&#xff0c;访问域名或者访问方式等会产生变化&#xff1b; 使用svc的方式来做可以保证不会改变&#xff1a;内部直接访问svc&#xff1b;外部会在dns上加上解析&#xff0c;以确保访问到外部地址。 …

PHP多维数组数据存储和读取

PHP中多维数组的数据存储和读取可以通过以下方式实现&#xff1a; 声明和初始化多维数组&#xff1a; $array array(array(1, 2, 3),array(4, 5, 6),array(7, 8, 9) );通过索引访问多维数组的元素&#xff1a; echo $array[0][0]; // 输出1 echo $array[1][2]; // 输出6使用…

20231214使用WPS将英文SRT字幕的全大写字符转换为首字母大写的小写字幕

20231214使用WPS将英文SRT字幕的全大写字符转换为首字母大写的小写字幕 2023/12/14 13:16 看英文纪录片&#xff0c;发现英文字母是全部大写。 所以需要整理成为小写的字幕【句子的首字符大小&#xff01;】 https://re.talking.1080p.hdtv.x265.aac.mvgroup.org/index.php?t…

【owt-server】清理日志:owt、srs、ffmpeg

运行一段时间后,云主机的磁盘满了owt的日志和 srs的日志比较多。查看日志文件占用: du 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹 关闭owt-server dist# ./bin/stop-all.sh root@k8s-master-2K4G:~/p2p/zdsvr-20201229/dist# ./bin/stop-all.sh stopp…

Excel函数 - Filter函数六种查询用法

语法&#xff1a;filter(查询区域&#xff0c;条件&#xff0c;查不到结果返回的值) 注意条件是布尔表达式&#xff0c;这个条件为true&#xff0c;filter才返回结果&#xff0c;否则查不到结果。 一、单条件查询&#xff0c;返回多行多列记录 我们要查询“苹果”这个水果&a…

【强化学习-读书笔记】有限马尔可夫决策过程

参考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. BartoMDP 是强化学习问题在数学上的理想化形式&#xff0c;因为在这个框架下我们可以进行精确的理论说明 智能体与环境的交互 智能体与环境交互&#xff0c;会得到轨迹&…

蓝桥杯网络安全组竞赛

竞赛规则及说明 选拔赛时长&#xff1a;4h 决赛时长&#xff1a;4h 竞赛形式&#xff1a;线上比赛&#xff1a; 个人赛&#xff1a;一人一机&#xff0c;全程机考 大赛制定竞赛系统&#xff0c;在时间内提交答案到比赛系统&#xff0c;超时无法提交 机器环境&#xff1a; 电脑…