【C++】STL的list容器介绍

news2024/9/23 23:27:40

目录

6、list容器

6.1list构造函数

6.2list赋值和交换

6.3list大小操作

6.4list插入

6.5list删除

6.6list数据存取

6.7list反转和排序


6、list容器

list本质是带头节点的双向循环链表,链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,链表由一系列结点组成,结点的组成一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

双向:可以从前往后,也可以从后往前遍历

循环:找尾节点的时间复杂度为O( 1 )

带头节点:代码实现简单,不用考虑链表为空等特殊情况,可令end()迭代器指向头节点的位置

优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

缺点:

  • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

最常用的容器为vector(动态数组)和list(双向循环链表)

6.1list构造函数

功能描述:创建list容器

list<T> lst;                      //list采用采用模板类实现,对象的默认构造形式
list(beg,end);                    //构造函数将[beg, end)区间中的元素拷贝给本身
list(n,elem);                     //构造函数将n个elem拷贝给本身
list(const list &lst);            //拷贝构造函数

测试案例代码:
void printList(const list<int>& L) {

    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

int main(void)
{
    list<int>L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);

        printList(L1);
    
        list<int>L2(L1.begin(), L1.end());
        printList(L2);
    
        list<int>L3(L2);
        printList(L3);
    
        list<int>L4(10, 1000);
        printList(L4);
    
    return 0;
}

6.2list赋值和交换

功能描述:对list容器进行赋值,交换list容器

assign(beg, end);                        //将[beg, end)区间中的数据拷贝赋值给本身
assign(n, elem);                         //将n个elem拷贝赋值给本身
list& operator=(const list &lst);        //重载等号操作符
swap(lst);                               //将lst与本身的元素互换

测试案例代码:
int main(void)
{
    list<int>L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);
        printList(L1);

        //赋值
        list<int>L2;
        L2 = L1;
        printList(L2);
    
        list<int>L3;
        L3.assign(L2.begin(), L2.end());
        printList(L3);
    
        list<int>L4;
        L4.assign(10, 100);
        printList(L4);

        return 0;
}

6.3list大小操作

功能描述:对list容器的大小进行操作

size();                //返回容器中元素的个数
empty();               //判断容器是否为空
resize(num);           //重新指定容器的长度为num,若容器变长,则以默认值填充新位置
  ​                     //如果容器变短,则末尾超出容器长度的元素被删除
resize(num, elem);     //重新指定容器的长度为num,若容器变长,则以elem值填充新位置
                    ​   //如果容器变短,则末尾超出容器长度的元素被删除

测试案例代码:
int main(void)
{
        list<int>L1;
        L1.push_back(10);
        L1.push_back(20);
        L1.push_back(30);
        L1.push_back(40);
    
        if (L1.empty())
        {
            cout << "L1为空" << endl;
        }
        else
        {
            cout << "L1不为空" << endl;
            cout << "L1的大小为: " << L1.size() << endl;
        }
    
        //重新指定大小
        L1.resize(10);
        printList(L1);
    
        L1.resize(2);
        printList(L1);
    
        return 0;
}

6.4list插入

功能描述:对list容器进行数据的插入

push_back(elem);         //在容器尾部加入一个元素
push_front(elem);        //在容器开头插入一个元素
insert(pos,elem);        //在pos位置插elem元素的拷贝,返回新数据的位置
insert(pos,n,elem);      //在pos位置插入n个elem数据,无返回值
insert(pos,beg,end);     //在pos位置插入[beg,end)区间的数据,无返回值

测试案例代码:
int main(void)
{
        list<int> L;
        //尾插
        L.push_back(10);
        L.push_back(20);
        L.push_back(30);
        //头插
        L.push_front(100);
        L.push_front(200);
        L.push_front(300);
    
        printList(L);
    
        //尾删
        L.pop_back();
        printList(L);
    
        //头删
        L.pop_front();
        printList(L);
    
        //插入
        list<int>::iterator it = L.begin();
        L.insert(++it, 1000);
        printList(L);
    
        //删除
        it = L.begin();
        L.erase(++it);
        printList(L);
    
        //移除
        L.push_back(10000);
        L.push_back(10000);
        L.push_back(10000);
        printList(L);
        L.remove(10000);
        printList(L);
    
        //清空
        L.clear();
        printList(L);
    
        return 0;
}

6.5list删除

功能描述:对list容器进行数据的删除

pop_back();             //删除容器中最后一个元素
pop_front();            //从容器开头移除第一个元素
clear();                //移除容器的所有数据
erase(beg,end);         //删除[beg,end)区间的数据,返回下一个数据的位置
erase(pos);             //删除pos位置的数据,返回下一个数据的位置
remove(elem);           //删除容器中所有与elem值匹配的元素

测试案例代码:
int main(void)
{
        list<int> L;
        //尾插
        L.push_back(10);
        L.push_back(20);
        L.push_back(30);
        //头插
        L.push_front(100);
        L.push_front(200);
        L.push_front(300);
    
        printList(L);
    
        //尾删
        L.pop_back();
        printList(L);
    
        //头删
        L.pop_front();
        printList(L);
    
        //插入
        list<int>::iterator it = L.begin();
        L.insert(++it, 1000);
        printList(L);
    
        //删除
        it = L.begin();
        L.erase(++it);
        printList(L);
    
        //移除
        L.push_back(10000);
        L.push_back(10000);
        L.push_back(10000);
        printList(L);
        L.remove(10000);
        printList(L);
    
        //清空
        L.clear();
        printList(L);
    
        return 0;
}

6.6list数据存取

功能描述:将容器中的元素反转,将容器中的数据进行排序

font();        //返回第一个元素。
back();        //返回最后一个元素

测试案例代码:
int main(void)
{
    list<int>L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);


        //cout << L1.at(0) << endl;//错误 不支持at访问数据
        //cout << L1[0] << endl; //错误  不支持[]方式访问数据
        cout << "第一个元素为: " << L1.front() << endl;
        cout << "最后一个元素为: " << L1.back() << endl;
    
        //list容器的迭代器是双向迭代器,不支持随机访问
        list<int>::iterator it = L1.begin();
        //it = it + 1;//错误,不可以跳跃访问,即使是+1

        return 0;
}

6.7list反转和排序

font();        //返回第一个元素。
back();        //返回最后一个元素

测试案例代码:
int main(void)
{
    list<int>L1;
    L1.push_back(10);
    L1.push_back(20);
    L1.push_back(30);
    L1.push_back(40);


        //cout << L1.at(0) << endl;//错误 不支持at访问数据
        //cout << L1[0] << endl; //错误  不支持[]方式访问数据
        cout << "第一个元素为: " << L1.front() << endl;
        cout << "最后一个元素为: " << L1.back() << endl;
    
        //list容器的迭代器是双向迭代器,不支持随机访问
        list<int>::iterator it = L1.begin();
        //it = it + 1;//错误,不可以跳跃访问,即使是+1

        return 0;
}

 

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

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

相关文章

学生必看!免费领取一台阿里云服务器

阿里云学生服务器优惠活动&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习成长历程&#xff0c;拥有一台云服务器是很…

Redis 批处理优化

一、优化建议 1、使用Pipeline Redis 的 Pipeline 可以将多个命令打包成一个请求&#xff0c;从而减少通信次数和网络开销。在批处理时&#xff0c;可以使用 Pipeline 来提高效率。 2、使用批量插入 Redis 支持批量插入&#xff0c;可以将多个数据一次性插入数据库&#xf…

一文看完Vue3的渲染过程

Vue3官网中有下面这样一张图&#xff0c;基本展现出了Vue3的渲染原理&#xff1a; 本文会从源码角度来草率的看一下Vue3的运行全流程&#xff0c;旨在加深对上图的理解&#xff0c;从下面这个很简单的使用示例开始&#xff1a; import { createApp, ref } from "vue"…

Python3 列表与元组 | 菜鸟教程(六)

目录 一、Python3 列表 &#xff08;一&#xff09;简介相关 1、序列是 Python 中最基本的数据结构。 2、序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 3、Python 有 6 个序列的内置…

Qt编写手机版本视频播放器和Onvif工具(可云台和录像)

一、前言 用Qtffmpeg写播放器很多人有疑问&#xff0c;为何不用Qt自己的多媒体框架来写&#xff0c;最重要的原因是Qt自带的目前都依赖具体的本地解码器&#xff0c;如果解码器不支持&#xff0c;那就是歇菜的&#xff0c;最多支持个MP4格式&#xff0c;而且在手机上也都是支持…

有效的括号

数据结构与算法应用往往隐藏在我们看不到的地方 20. 有效的括号 力扣题目链接 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括…

【Python 随练】打印楼梯与笑脸

题目&#xff1a; 打印楼梯&#xff0c;并在楼梯上方打印两个笑脸 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用 Python 代码打印一个楼梯&#xff0c;并在楼梯上方打印两个笑脸。我们将给出问题的解析&#xff0c;并提供一个完整的代码示例来实现这个效果。 问题…

多目标优化算法:多目标浣熊优化算法(multi-objective Coati Optimization Algorithm,MOCOA)

一、浣熊优化算法COA 浣熊优化算法&#xff08;Coati Optimization Algorithm&#xff0c;COA&#xff09;由Dehghani Mohammad等人于2022年提出的模拟浣熊狩猎行为的优化算法&#xff0c;该算法具有进化能力强&#xff0c;收敛速度快&#xff0c;收敛精度高等特点。 COA具体…

【算法与数据结构】454、LeetCode 四数相加 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题不仅要计算元素的和为0&#xff0c;还要计算元素和为零出现的次数&#xff0c;说明这道题map比较…

【Python 随练】输出国际象棋棋盘

题目&#xff1a; 输出国际象棋棋盘 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用 Python 代码输出国际象棋棋盘。国际象棋棋盘是一个8x8的方格矩阵&#xff0c;交替使用黑色和白色方格。我们将给出问题的解析&#xff0c;并提供一个完整的代码示例来生成这个棋盘。…

C语言之指针详解(1)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 大家对比前面C语言之指针初阶来看&#xff0c;指针进阶明显看起来难度大了很多&#xff…

TLS协议详解,一文带你了解TLS协议

前言 TLS&#xff08;Transport Layer Security&#xff09;是一种安全协议&#xff0c;用于保护网络通信的安全性和隐私性。它是SSL&#xff08;Secure Sockets Layer&#xff09;的后继者&#xff0c;用于在互联网上建立安全的通信连接。本文将介绍TLS的概论、工作原理、发展…

计算机网络——物理层-数据通信的基础知识

物理层的基本概念 在计算机网络中&#xff0c;物理层是网络协议栈中的第一层&#xff0c;负责处理网络中传输数据的物理介质和信号传输的细节。它定义了传输数据的电气、光学和机械特性&#xff0c;以及物理连接的规范和接口标准。 物理层的主要任务是将比特流&#xff08;0和…

C++之AVL树

目录 一.介绍二.简单实现AVL树1. 基本框架2. 插入结点(Insert)a. 更新平衡因子b. 左单旋c. 右单旋d. 左右双旋e. 右左双旋 3. 删除节点(Erase)a. 更新平衡因子b. 旋转c. 代码 4. 测试 一.介绍 作为对二叉搜索树的优化版本。AVL树是由俄罗斯的两位数学家G.M.Adelson-Velskii和E.…

Python 3 基本语法与基本数据类型 | 菜鸟教程(二)

目录 一、Python3 基础语法 &#xff08;一&#xff09;编码 &#xff08;二&#xff09;标识符 &#xff08;三&#xff09;python保留字 &#xff08;四&#xff09;注释 ​&#xff08;五&#xff09;行与缩进 &#xff08;六&#xff09;多行语句 &#xff08;七&am…

操作系统复习笔记3

1、条件变量和互斥锁 条件变量一般和互斥锁一起使用&#xff0c;来弥补互斥锁的不足。总得来说&#xff0c;互斥锁用来规范线程对共享数据的竞争使用&#xff0c;条件变量用来协调各个线程合作完成任务。 2、enum枚举类型 enum typeName { valueName1, valueName2, valueName3…

Workerman在线客服系统源码 附搭建文档

Workerman在线客服系统源码 模块化开发 强大的一键生成功能极速简化你的开发流程&#xff0c;加快你的项目开发 响应式布局 自动适配&#xff0c;无需要担心兼容性问题 完善的权限管理 自由分配子级权限、一个管理员司同时属于多个组别 通用的会员和API模块 共用同一账…

【MySQL多表查询】:让你的数据检索更高效

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL中多表查询相关知识的讲解 目录 前言一、多表关系二、多表查询1、交叉连接2、内连接3、外连接 三、集合运算四、七种JOINS实现五、多表查询练习六、总结 一、多表关系 ✨项目开发中&#xff0c;在进行数据库表结…

6月人工智能论文推荐

Prompt Space Optimizing Few-shot Reasoning Success with Large Language Models https://arxiv.org/abs/2306.03799 Prompt engineering 是通过提供明确和具体的指令来增强大型语言模型(llm)能力的基本技术。它使LLM能够在各种任务中脱颖而出&#xff0c;例如算术推理、问…

列表、表格、表单

day02&#xff1a;列表、表格、表单 目标&#xff1a;掌握嵌套关系标签的写法&#xff0c;使用列表标签布局网页 01-列表 作用&#xff1a;布局内容排列整齐的区域。 列表分类&#xff1a;无序列表、有序列表、定义列表。 无序列表 作用&#xff1a;布局排列整齐的不需要规…