C++:list类

list的介绍

1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代
2. list 的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
3. list forward_list 非常相似:最主要的不同在于 forward_list 是单链表,只能朝前迭代,已让其更简单高效。
4. 与其他的序列式容器相比 (array vector deque) list 通常在任意位置进行插入、移除元素的执行效率更好。
5. 与其他序列式容器相比, list forward_list 最大的缺陷是不支持任意位置的随机访问,比如:要访问 list的第6 个元素,必须从已知的位置 ( 比如头部或者尾部 ) 迭代到该位置,在这段位置上迭代需要线性的时间开销;list 还需要一些额外的空间,以保存每个节点的相关联信息 ( 对于存储类型较小元素的大 list 来说这可能是一个重要的因素)

list的构造

list<int> l1;                         // 构造空的l1
list<int> l2(4, 100);                 // l2中放4个值为100的元素
list<int> l3(l2.begin(), l2.end());  // 用l2的[begin(), end())左闭右开的区间构造l3
list<int> l4(l3);                    // 用l3拷贝构造l4
// 以数组为迭代器区间构造l5
    int array[] = { 16,2,77,29 };
    list<int> l5(array, array + sizeof(array) / sizeof(int));

    // 列表格式初始化C++11
    list<int> l6{ 1,2,3,4,5 };

list iterator 的使用
// 用迭代器方式打印l5中的元素
    list<int>::iterator it = l5.begin();
    while (it != l5.end())
    {
        cout << *it << " ";
        ++it;
    }       
    cout << endl;

    // C++11范围for的方式遍历
    for (auto& e : l5)
        cout << e << " ";

    cout << endl;
}
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array + sizeof(array) / sizeof(array[0]));
    // 使用正向迭代器正向list中的元素
    // list<int>::iterator it = l.begin();   // C++98中语法
    auto it = l.begin();                     // C++11之后推荐写法
    while (it != l.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;

    // 使用反向迭代器逆向打印list中的元素
    // list<int>::reverse_iterator rit = l.rbegin();
    auto rit = l.rbegin();
    while (rit != l.rend())
    {
        cout << *rit << " ";
        ++rit;
    }
    cout << endl;

 注意:遍历链表只能用迭代器和范围for

1. begin end 为正向迭代器,对迭代器执行 ++ 操作,迭代器向后移动
2. rbegin(end) rend(begin) 为反向迭代器,对迭代器执行 ++ 操作,迭代器向前移动

list capacity

list element access


    list<int>a = {1,2,3,4,5};
	cout << a.front()<<" "<<a.back();//1 5
    return 0;

list modifiers



int array[] = { 1, 2, 3 };
    list<int> L(array, array + sizeof(array) / sizeof(array[0]));

    // 在list的尾部插入4,头部插入0
    L.push_back(4);
    L.push_front(0);
    PrintList(L);

    // 删除list尾部节点和头部节点
    L.pop_back();
    L.pop_front();
    PrintList(L);
insert
int array1[] = { 1, 2, 3 };
    list<int> L(array1, array1 + sizeof(array1) / sizeof(array1[0]));

    // 获取链表中第二个节点
    auto pos = ++L.begin();
    cout << *pos << endl;//2

    // 在pos前插入值为4的元素
    L.insert(pos, 4);//1 4 2 3
   

    // 在pos前插入5个值为5的元素
    L.insert(pos, 5, 5);// 1 4 5 5 5 5 5 2 3
   

    // 在pos前插入[v.begin(), v.end)区间中的元素
    list<int> v{ 7, 8, 9 };
    L.insert(pos, v.begin(), v.end());//1 4 5 5 5 5 5 7 8 9 2 3
  
    
    return 0;
erase
L:1 4 5 5 5 5 5 7 8 9 2 3  pos:元素2的位置
    // 删除pos位置上的元素
    L.erase(pos);//1 4 5 5 5 5 5 7 8 9 3
    

    // 删除list中[begin, end)区间中的元素,即删除list中的所有元素
    L.erase(L.begin(), L.end());//空
swap
// 用数组来构造list
    int array1[] = { 1, 2, 3 };
    list<int> l1(array1, array1 + sizeof(array1) / sizeof(array1[0]));
    PrintList(l1);

    // 交换l1和l2中的元素
    list<int> l2;
    l1.swap(l2);
    PrintList(l1);
    PrintList(l2);
clear
list<int> l2={1,2,3};
l2.clear();
其他成员函数

reverse

list<int> lt={1,2,3,4,5,6};

lt.reverse();//6 5 4 3 2 1

sort

仿函数

int array1[] = { 1, 2, 3 };
list<int> L(array1, array1 + sizeof(array1) / sizeof(array1[0]));

L.sort(greater<int>());//3 2 1

unique

int array1[] = { 1, 2,2,2,3 };
    list<int> L(array1, array1 + sizeof(array1) / sizeof(array1[0]));

    L.unique();//1 2 3  

去除相同的元素使其变得唯一

splice
void splice (const_iterator position, list& x);
void splice (const_iterator position, list&& x);
void splice (const_iterator position, list& x, const_iterator i);
void splice (const_iterator position, list&& x, const_iterator i);

void splice (const_iterator position, list& x, const_iterator first, const_iterator last);

void splice (const_iterator position, list&& x, const_iterator first, const_iterator last);

 

    list<int> L = {1,2,3,4};
    list<int> L2 = {10,20,30,40};
    L.splice(L.end(), L, L.begin());//2 3 4 1
    L2.splice(L2.begin(), L);//2 3 4 1 10 20 30 40

list非成员函数

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置&#xff1a; 中断回调函数完善一下&#xff1a; void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…

算法——动态规划:01背包

原始01背包见下面这篇文章&#xff1a;http://t.csdnimg.cn/a1kCL 01背包的变种&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 简化一…

数据结构:单调栈和单调队列

文章目录 一、单调栈1.1、栈的思想1.2、单调栈1.2.1、单调栈的基本应用&#xff1a;找出数组中每个元素右侧第一个更大的元素1.2.2、单调栈的基本应用&#xff1a;找出数组中每个元素左侧第一个更大的元素1.2.3、单调栈拓展1.2.4、单调栈LeetCode题单 二、单调队列2.1、队列的思…

【chemistry 5】脂类代谢、氨基酸代谢、核酸代谢

&#x1f31e;欢迎来到生物化学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月29日&…

Discourse 用户可以自己修改用户名吗

Discourse 是可以修改用户名的&#xff0c;但用户修改自己的用户名会有时间的限制。 这是因为根据官方的说法就是当用户修改用户名后可能会导致内容的失效等问题。 在默认的安装配置下&#xff0c;用户可以在完成注册后的 3 天自己对用户名进行修改。 3 天以后&#xff0c;用…

【CASS精品教程】CASS11台阶画法大全

文章目录 一、无边台阶二、有边台阶三、圆弧无边台阶四、U型台阶五、曲线U型台阶六、L型台阶一、无边台阶 点击【居民地】→【房屋附属】→【台阶】: 选择【两点边】即可。 两点边的绘制方法是,依次点击四个点,或者点击三个点后空格,注意台阶缺口(有白色线条)为下。 四…

HarmonyOS实战开发-Stage模型下Ability的创建和使用

介绍 本篇Codelab基于Stage模型&#xff0c;对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability&#xff0c;并使用UIAbilityContext启动另一个Ability&#xff0c;然后借助Want&#xff0c;在Ability之间传递参数&#xf…

基于SpringBoot的“财务管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“财务管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 管理员功能界面图…

Deepspeed、ZeRO、FSDP、ZeRO-Offload、all reduce、reduce-scatter

Transformer为基础的大模型应该如何并行 数据并行。但是如果模型太大放不到一块卡上就没用了。为了解决把参数放到一块卡上的问题&#xff0c;演进出了论文Zero的思想&#xff0c;分为Zero-DP和Zero-R两部分。Zero-DP是解决Data parallel的问题&#xff0c;并行过程中内容不够…

Plecs电力电子仿真专业教程-软件操作

Plecs仿真软件基本操作方法&#xff1a; 从连线中引出线&#xff1a;Ctrl 鼠标左键 设置元件参数&#xff1a;双击元件&#xff0c;进行设置&#xff0c;若要显示参数&#xff0c;则在参数后的方框打勾。 CTRL E ---- 仿真参数设置 Ctrl T -----开始仿真 CtrlF …

如何检查电脑的最近历史记录?这里提供详细步骤

如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。 如何检查我的计算机的最近历史记录 要检查计算机的最近历史记录,应该从web浏览器历史记录开始,然后移动到文件。但是,可以修改或删除浏览器历史记录,也可以隐藏Windows…

Redis 和 Mysql 数据库数据如何保持一致性????

1、前言 我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力&#xff0c;但是当更新数据库时&#xff0c;如何保证缓存及数据库一致性&#xff0c;一般我们采用延时双删策略。 目前系统中常用的做法是一个查询接口&#xff0c;先查询Redis&#xff0c;如果不存在则查询…

Vue——案例01(查询用户)

一、案例实现页面 二、案例实现效果 1. 查询效果 2. 年龄升序 3. 年龄降序 4. 原顺序 三、案例实现思路 1. 定义界面所需标签样式 <div id"app"><h2>查询用户:</h2><input type"text" placeholder"请输入名字"/><b…

RabbitMQ高级笔记

视频链接&#xff1a;【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…

Python基础之函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.收集函数2.收集关键字函数3.分配关键字函数4.调用自己编写的模块函数5.匿名函数lambda6.lambda函数和filter函数联用7.lambda函数和map函数联用 前言 1.收集…

SQL109 纠错4(组合查询,order by..)

SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state MI UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state IL ORDER BY cust_name;order by子句&#xff0c;必须位于最后一条select语句之后

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分&#xff0c;而Facebook作为其领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章&#xff0c;并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…

Nuxt v4 即将到来!2024 年 Nuxt 发展方向和想法

在 2023 年里&#xff0c;Nuxt 发生了很多事情。 Sbastien 和 Daniel 分享了他们对 Nuxt 所取得的成就以及下一步的发展方向的看法。 2023 年回顾 - Sbastien 2023 年 1 月&#xff0c;Daniel 提出了 Nuxt&#xff1a;2023 年愿景。我们实现了设定的大部分目标。其中一些缺失…

怎么把学浪的课上传到网盘

如何把学浪的课程上传到百度网盘&#xff0c;这是一个老大难的问题&#xff0c;视频的m3u8的key加密&#xff0c;作为非专业人士不知道如何下载&#xff0c;这里就教大家如何将学浪的课程下载下来&#xff0c;上传到自己网盘&#xff0c;随时随地的观看&#xff0c;或者分享给自…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…