C++ list 容器用法

news2025/7/15 14:45:58

C++ list 容器用法

       C++ 标准库提供了丰富的功能,其中 <list> 是一个非常重要的容器类,用于存储元素集合,支持双向迭代器。<list> 是 C++ 标准模板库(STL)中的一个序列容器,它允许在容器的任意位置快速插入和删除元素。与数组或向量(<vector>)不同,<list> 不需要在创建时指定大小,并且可以在任何位置添加或删除元素,而不需要重新分配内存。如果我们希望在一个序列中添加和删除元素的同时无须移动其他元素,可以使用 list 。

语法

以下是 <list> 容器的一些基本操作:

  • 包含头文件:#include <list>
  • 声明列表:std::list<T> mylist;,其中 T 是存储在列表中的元素类型。
  • 插入元素:mylist.push_back(value);
  • 删除元素:mylist.pop_back(); 或 mylist.erase(iterator);
  • 访问元素:mylist.front(); 和 mylist.back();
  • 遍历列表:使用迭代器 for (auto it = mylist.begin(); it != mylist.end(); ++it)

特点

  • 双向迭代<list> 提供了双向迭代器,可以向前和向后遍历元素。
  • 动态大小:与数组不同,<list> 的大小可以动态变化,不需要预先分配固定大小的内存。
  • 快速插入和删除:可以在列表的任何位置快速插入或删除元素,而不需要像向量那样移动大量元素。

常用成员函数

以下是 <list> 中一些常用的成员函数:

函数说明
push_back(const T& val)在链表末尾添加元素
push_front(const T& val)在链表头部添加元素
pop_back()删除链表末尾的元素
pop_front()删除链表头部的元素
insert(iterator pos, val)在指定位置插入元素
erase(iterator pos)删除指定位置的元素
clear()清空所有元素
size()返回链表中的元素数量
empty()检查链表是否为空
front()返回链表第一个元素
back()返回链表最后一个元素
remove(const T& val)删除所有等于指定值的元素
sort()对链表中的元素进行排序
merge(list& other)合并另一个已排序的链表
reverse()反转链表
begin() / end()返回链表的起始/结束迭代器

声明与初始化

<list> 的声明和初始化与其他容器类似:

#include <iostream>
#include <list>

int main()
{
    std::list<int> lst1;                // 空的list
    std::list<int> lst2(5);             // 包含5个默认初始化元素的list
    std::list<int> lst3(5, 10);         // 包含5个元素,每个元素为10
    std::list<int> lst4 = {1, 2, 3, 4}; // 使用初始化列表

    return 0;
}

实例

例1、list 插入和删除元素

#include <iostream>
#include <list>

int main() 
{
    std::list<int> lst = {10, 20, 30};

    // 插入和删除元素
    lst.push_front(5);           // 在头部插入5
    lst.push_back(40);           // 在尾部插入40
    lst.pop_front();             // 删除头部元素
    lst.pop_back();              // 删除尾部元素

    // 输出链表内容
    std::cout << "List elements: ";
    for (const auto& elem : lst) 
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

例2、list 插入和删除特定位置的元素

#include <iostream>
#include <list>

int main() 
{
    std::list<int> lst = {1, 2, 3, 4, 5};
    auto it = lst.begin();
    std::advance(it, 2);// 移动迭代器到第3个元素(值为3)

    lst.insert(it, 10);// 在第3个元素前插入10
    lst.erase(it);// 删除第3个元素

    //输出链表内容
    std::cout << "List elements: ";
    for (const auto& elem : lst) 
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

例3、排序和去重

#include <iostream>
#include <list>

int main() 
{
    std::list<int> lst = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    lst.sort();//排序
    lst.unique();//删除相邻重复元素

    //输出链表内容
    std::cout << "Sorted and unique list: ";
    for (const auto& elem : lst) 
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

例4、合并和反转

#include <iostream>
#include <list>

int main() 
{
    std::list<int> lst1 = {1, 3, 5, 7};
    std::list<int> lst2 = {2, 4, 6, 8};

    lst1.merge(lst2);//合并两个已排序的链表
    lst1.reverse();  //反转链表

    //输出链表内容
    std::cout << "Merged and reversed list: ";
    for (const auto& elem : lst1) 
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

与其他容器对比

特性std::liststd::vectorstd::deque
内存结构非连续内存,双向链表连续内存分段连续内存
访问性能顺序访问较快,随机访问慢随机访问快末尾和头部访问都快
插入/删除性能任意位置插入、删除快末尾插入快,中间位置慢头尾插入、删除快
适用场景频繁在中间插入/删除需要高效随机访问需要在头尾快速插入/删除
迭代器稳定性稳定,元素插入或删除不会失效插入、删除可能导致迭代器失效插入、删除可能导致迭代器失效

注意事项

  • <list> 的元素是按插入顺序存储的,而不是按元素值排序。
  • 由于 <list> 的元素存储在不同的内存位置,所以它不适合需要随机访问的场景。
  • 与向量相比,<list> 的内存使用效率较低,因为每个元素都需要额外的空间来存储指向前后元素的指针。

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

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

相关文章

解密全同态加密中的自举(Bootstrapping)

摘要 自举&#xff08;Bootstrapping&#xff09;是全同态加密&#xff08;Fully Homomorphic Encryption, FHE&#xff09;中经常使用的术语。熟悉 FHE 的人都知道&#xff0c;自举是 FHE 方案中最复杂且计算密集的部分。然而&#xff0c;只有极少数非 FHE 专家真正理解自举操…

显示当前绑定变量

来自v$sql中的信息 测试两个变量的情况&#xff08;实际可以看6个&#xff0c;可根据需要修改&#xff09; DROP TABLE T1 PURGE; CREATE TABLE T1 AS SELECT A.*,SYSDATE RIQI FROM DBA_USERS A ORDER BY 1;var mc char(3); var id number; exec :mc:SYS; exec :id:50;set li…

arm-linux-gnueabihf安装

Linaro Releases windows下打开wsl2中的ubuntu&#xff0c;资源管理器中输入&#xff1a; \\wsl$gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 复制到/home/ark01/tool 在 Ubuntu 中创建目录&#xff1a; /usr/local/arm&#xff0c;命令如下&#xff1a; …

宝塔面板SSL加密访问设置教程

参考:https://www.bt.cn/bbs/thread-117246-1-1.html 如何快速使用证书加密访问面板 因早期默认未开启https访问所以没有相关的风险提醒&#xff0c;现面板默认已开启https加密访问、提升安全性 由于采用的是服务器内部本身签发证书&#xff0c;不被公网浏览器信任请参考以下步…

Baklib在知识管理创新中的价值体现与其他产品的优势比较分析

内容概要 在当前的数字化时代&#xff0c;知识管理成为企业成功的重要组成部分。有效的知识管理不仅有助于提升内部沟通效率&#xff0c;还能促进创新与决策的科学化。尤其是Baklib作为一种知识中台&#xff0c;具有独特的价值&#xff0c;它能够融合企业内外的知识资源&#…

机器学习周报-文献阅读

文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作&#xff08;Masking Operation&#xff09; 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…

C语言连接Mysql

目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一&#xf…

Synology 群辉NAS安装(6)安装mssql

Synology 群辉NAS安装&#xff08;6&#xff09;安装mssql 写在前面mssql 2019:成功安装说明&#xff0c;这个最终成功了 mssql 2022没有成功1. pull image2.启动mssql docker container 远程连接 写在前面 mssq是一个重要节点。 这是因为我对mysql没有一丝好感。虽然接触了许…

WEB集群1-5天

文章目录 第一天、1、初始化配置1. 编写的初始化的脚本 init_env.sh2. 远程拷贝初始化脚本到mysql服务器里3.在mysql这台服务器上执行脚本 2、总结 第二天1、yumyum介绍yum操作将冯老师提供的网站的源码包上传到web服务器 2、部署网站1、解压文件2、epel源&#xff1a;可以提供…

“AI视频智能分析系统:让每一帧视频都充满智慧

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个特别厉害的东西——AI视频智能分析系统。想象一下&#xff0c;如果你有一个超级聪明的“视频助手”&#xff0c;它不仅能自动识别视频中的各种元素&#xff0c;还能根据内容生成详细的分析报告&#xff0c;是不是感觉特别酷…

kaggle视频追踪NFL Health Safety - Helmet Assignment

3年前的比赛了&#xff0c;检测视频中的头盔&#xff0c;通过对比赛录像的分析&#xff0c;正确指派球员。每个进攻都有两个相关的视频&#xff0c;一个是边线视角&#xff0c;另一个是端区视角&#xff0c;而且这两个视频是同步的&#xff0c;即视频中的每一帧都是对应的。我用…

idea对jar包内容进行反编译

1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径&#xff0c;在idea的plugins下面的lib文件夹内&#xff1a;java-decompiler.jar。下面是我自己本地的插件路径&#xff0c;以作参考&#xff1a; D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…

deepseek R1 14b硬件要求

RTX2080ti 11G显卡&#xff0c;模型7b速度挺快&#xff0c;试试14B也不错。 7B显存使用5.6G&#xff0c;11B显存刚好够&#xff0c;出文字速度差不多。 打算自己写个移动宽带的IPTV播放器&#xff0c;不知道怎么下手&#xff0c;就先问他了。

DeepSeek-R1环境搭建推理测试

引子 这两天国货之光DeepSeek-R1火爆出圈&#xff0c;凑个热闹。过来看看 aha moment&#xff08;顿悟时刻&#xff09;的神奇&#xff0c;OK&#xff0c;我们开始吧。 一、模型介绍 1月20日&#xff0c;中国AI公司深度求索&#xff08;DeepSeek&#xff09;发布的DeepSeek-…

记录 | 基于Docker Desktop的MaxKB安装

目录 前言一、MaxKBStep 1Step2 二、运行MaxKB更新时间 前言 参考文章&#xff1a;如何利用智谱全模态免费模型&#xff0c;生成大家都喜欢的图、文、视并茂的文章&#xff01; MaxKB的Github下载地址 参考视频&#xff1a;【2025最新MaxKB教程】10分钟学会一键部署本地私人专属…

练习(复习)

大家好&#xff0c;今天我们来做几道简单的选择题目来巩固一下最近学习的知识&#xff0c;以便我们接下来更好的学习。 这道题比较简单&#xff0c;我们前面学过&#xff0c;在Java中&#xff0c;一个类只能继承一个父类&#xff0c;但是一个父类可以有多个子类&#xff0c;一个…

【原创改进】SCI级改进算法,一种多策略改进Alpha进化算法(IAE)

目录 1.前言2.CEC2017指标3.效果展示4.探索开发比5.定性分析6.附件材料7.代码获取 1.前言 本期推出一期原创改进——一种多策略改进Alpha进化算法&#xff08;IAE&#xff09;~ 选择CEC2017测试集低维&#xff08;30dim&#xff09;和高维&#xff08;100dim&#xff09;进行测…

56. 协议及端口号

协议及端口号 在计算机网络中&#xff0c;协议和端口号是两个重要的概念。它们共同确保了不同计算机和网络设备之间可以正确、有效地进行通信。 协议&#xff08;Protocol&#xff09; 协议是网络通信的一组规则或标准&#xff0c;它定义了如何在计算机网络中发送、接收和解释…

短链接项目02---依赖的添加和postman测试

文章目录 1.声明2.对于依赖的引入和处理2.1原有的内容说明2.2添加公共信息2.3dependencies和management区别说明2.4添加spring-boot依赖2.5数据库的相关依赖2.6hutool工具类的依赖添加2.7测试test 的依赖添加 3.core文件的代码3.1目录层级结构3.2启动类3.3testcontroller测试类…

ADC 精度 第二部分:总的未调整误差解析

在关于ADC精度的第一篇文章中&#xff0c;我们阐述了模拟-数字转换器&#xff08;ADC&#xff09;的分辨率和精度之间的区别。现在&#xff0c;我们可以深入探讨影响ADC总精度的因素&#xff0c;这通常被称为总未调整误差&#xff08;TUE&#xff09;。 你是否曾好奇ADC数据表…