C++STL(queue和list)

3.6 queue 容器

3.6.1 queue 基本概念

概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口

  • 队列容器允许从一端新增元素,从另一端移除元素
  • 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
  • 队列中进数据称为 --- 入队   `push`
  • 队列中出数据称为 --- 出队   `pop`

3.6.2 queue 常用接口

功能描述:栈容器常用的对外接口

构造函数:

  • - `queue<T> que;`                                 //queue采用模板类实现,queue对象的默认构造形式
  • - `queue(const queue &que);`            //拷贝构造函数

赋值操作:

  • - `queue& operator=(const queue &que);`           //重载等号操作符

数据存取:

  • - `push(elem);`                             //往队尾添加元素
  • - `pop();`                                      //从队头移除第一个元素
  • - `back();`                                    //返回最后一个元素
  • - `front(); `                                  //返回第一个元素

大小操作:

  • - `empty();`            //判断堆栈是否为空
  • - `size(); `              //返回栈的大小

代码示例:

#include <queue>
#include <string>
class Person{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};void test01() {//创建队列queue<Person> q;//准备数据Person p1("唐僧", 30);Person p2("孙悟空", 1000);Person p3("猪八戒", 900);Person p4("沙僧", 800);//向队列中添加元素  入队操作q.push(p1);q.push(p2);q.push(p3);q.push(p4);//队列不提供迭代器,更不支持随机访问	while (!q.empty()) {//输出队头元素cout << "队头元素-- 姓名: " << q.front().m_Name << " 年龄: "<< q.front().m_Age << endl;cout << "队尾元素-- 姓名: " << q.back().m_Name  << " 年龄: " << q.back().m_Age << endl;cout << endl;//弹出队头元素q.pop();}cout << "队列大小为:" << q.size() << endl;
}int main() {test01();system("pause");return 0;
}

总结:

  • - 入队   --- push
  • - 出队   --- pop
  • - 返回队头元素   --- front
  • - 返回队尾元素   --- back
  • - 判断队是否为空   --- empty
  • - 返回队列大小   --- size

3.7 list容器

3.7.1 list基本概念

功能:将数据进行链式存储

        链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

        链表的组成:链表由一系列结点组成

        结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

        STL中的链表是一个双向循环链表,由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

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

list的缺点:

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

        List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

        总结:STL中List和vector是两个最常被使用的容器,各有优缺点

3.7.2  list构造函数

功能描述:创建list容器

函数原型:

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

代码示例:

#include <list>void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}void test01(){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);
}int main() {test01();system("pause");return 0;
}

总结:list构造方式同其他几个STL常用容器,熟练掌握即可

3.7.3 list 赋值和交换

功能描述:给list容器进行赋值,以及交换list容器

函数原型:

  • `assign(beg, end);`            //将[beg, end)区间中的数据拷贝赋值给本身。
  • `assign(n, elem);`              //将n个elem拷贝赋值给本身。
  • `list& operator=(const list &lst);`         //重载等号操作符
  • `swap(lst);`                         //将lst与本身的元素互换。
#include <list>void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}//赋值和交换
void test01(){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);}//交换
void test02(){list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);list<int>L2;L2.assign(10, 100);cout << "交换前: " << endl;printList(L1);printList(L2);cout << endl;L1.swap(L2);cout << "交换后: " << endl;printList(L1);printList(L2);}int main() {//test01();test02();system("pause");return 0;
}

总结:list赋值和交换操作能够灵活运用即可

3.7.4 list 大小操作

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

函数原型:

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

代码示例:

#include <list>void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}//大小操作
void test01(){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);
}int main() {test01();system("pause");return 0;
}

总结:

  • - 判断是否为空   --- empty
  • - 返回元素个数   --- size
  • - 重新指定个数   --- resize

3.7.5 list 插入和删除

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

函数原型:

  • push_back(elem);//在容器尾部加入一个元素
  • pop_back();//删除容器中最后一个元素
  • push_front(elem);//在容器开头插入一个元素
  • pop_front();//从容器开头移除第一个元素
  • insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();//移除容器的所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。
  • remove(elem);//删除容器中所有与elem值匹配的元素。
#include <list>void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}//插入和删除
void test01(){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);
}int main() {test01();system("pause");return 0;
}

总结:

  • 尾插   --- push_back
  • 尾删   --- pop_back
  • 头插   --- push_front
  • 头删   --- pop_front
  • 插入   --- insert
  • 删除   --- erase
  • 移除   --- remove
  • 清空   --- clear

3.7.6 list 数据存取

功能描述:对list容器中数据进行存取

函数原型:

  • `front();`        //返回第一个元素。
  • `back();`         //返回最后一个元素。

代码示例:

#include <list>//数据存取
void test01(){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
}int main() {test01();system("pause");return 0;
}

总结:

  • list容器中不可以通过[]或者at方式访问数据
  • 返回第一个元素   --- front
  • 返回最后一个元素   --- back

3.7.7 list 反转和排序

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

函数原型:

  • `reverse();`   //反转链表
  • `sort();`        //链表排序
void printList(const list<int>& L) {for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {cout << *it << " ";}cout << endl;
}bool myCompare(int val1 , int val2){return val1 > val2;
}//反转和排序
void test01(){list<int> L;L.push_back(90);L.push_back(30);L.push_back(20);L.push_back(70);printList(L);//反转容器的元素L.reverse();printList(L);//排序L.sort(); //默认的排序规则 从小到大printList(L);L.sort(myCompare); //指定规则,从大到小printList(L);
}int main() {test01();system("pause");return 0;
}

总结:

  • 反转   --- reverse
  • 排序   --- sort (成员函数)

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

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

相关文章

【Open AI】GPT-4o深夜发布:视觉、听觉跨越式升级

北京时间5月14日1点整&#xff0c;OpenAI 召开了首场春季发布会&#xff0c;CTO Mira Murati 在台上和团队用短短不到30分钟的时间&#xff0c;揭开了最新旗舰模型 GPT-4o 的神秘面纱&#xff0c;以及基于 GPT-4o 的 ChatGPT&#xff0c;均为免费使用。 本文内容来自OpenAI网站…

大数据面试 --- 六

1、Flink中的三种时间&#xff0c;哪一个性能会比较好 在Flink中主要分成三种时间&#xff1a; 事件时间&#xff08;Event Time&#xff09;注入时间&#xff08;Process Time&#xff09;、摄入时间&#xff08;Ingestion Time&#xff09; 事件时间指的是事件产生的时间…

课时126:awk实践_进阶知识_内置函数1

1.2.5 内置函数1 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 在awk内部预制了一些函数&#xff0c;借助于这些函数&#xff0c;我们可以实现相关场景的快速操作。这些内置函数的常见类型有&#xff1a;数值类内置函数int…

人工智能|深度学习——YOLOV8结构图

YoloV8相对于YoloV5的改进点&#xff1a; Replace the C3 module with the C2f module.Replace the first 6x6 Conv with 3x3 Conv in the Backbone.Delete two Convs (No.10 and No.14 in the YOLOv5 config).Replace the first 1x1 Conv with 3x3 Conv in the Bottleneck.Use…

【图神经网络——消息传递】

消息传递机制 画图先&#xff1a;导包&#xff1a;画图&#xff1a; 实现消息传递&#xff1a;例子一&#xff1a;例子二&#xff1a; 画图先&#xff1a; 导包&#xff1a; import networkx as nx import matplotlib.pyplot as plt import torch from torch_geometric.nn im…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列&#xff0c;其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列&#xff1a; Red Hat Enterprise Linux (RHEL)&#xff1a;这是Red Hat公司推出的企业级操作系统&#…

【LAMMPS学习】十、LAMMPS辅助工具(1)

10. 辅助工具 LAMMPS 被设计为用于执行分子动力学计算的计算内核。设置和分析模拟通常需要额外的预处理和后处理步骤。此类工具的列表可以在 LAMMPS 网页上的以下链接中找到&#xff1a; 前/后处理 外部 LAMMPS 软件包和工具 Pizza.py 工具包 Pizza.py 的最后一个链接是桑迪…

CTFshow misc

第一题1 打开图片直接就是flag 第二题0 放入010发现文件头有png 更换后缀 获得flag 第三题1 下载之后发现是bpg后缀 用在线工具转换为png获得flag 第四题 0 把六个文件后缀都改为png即可获得flag

Visual Studio Code 扩展程序Text Edits

需求 比如把Scarzombie_Monster全部转换为大写或者小写 安装 Text Edits 直接搜索安装即可 使用 假如要把Scarzombie_Monster全部转为大写&#xff0c;选中右键选中 To Upper Case或者直接快捷键shiftAltU即可

使用yolov8 训练coco 和自己的关键点识别数据集的参考

使用yolov8 训练关键点配置理解 1. coco-pose.yaml 修改关键参数kpt_shape: [17, 3]flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]2. yolov8n-pose.yaml 修改kpt_shape3. 编写 train文件4.一个封装的推理代码1. coco-pose.yaml 修改关键参数 kpt_sha…

DHCP动态主机配置协议

DHCP概述 DHCP是什么 DHCP&#xff1a;Dynamic Host Configuration Protocol&#xff1a;动态主机配置协议DHCP是一种集中对用户IP地址进行动态管理和配置的技术 DHCP作用&#xff1a; 作用&#xff1a;实现IP地址的动态分配和集中管理优势&#xff1a;避免手工配置IP地址&…

linux编译gdb

下载 我下载了8.3 Index of /gnu/gdb 编译 make cleanmake diskclean./configure \--without-x \--disable-werrormake make install

微信小程序的自定义组件

一、创建自定义组件 &#xff08;1&#xff09;定义&#xff1a; 把页面重复的代码部分封装成为一个自定义组件&#xff0c;以便在不同的页面中重复使用&#xff0c;有助于代码的维护。 &#xff08;2&#xff09;组成&#xff1a; 自定义组件的组成&#xff1a;json文件&a…

.gitignore文件使用指南

.gitignore文件使用指南 .gitignore 文件的作用 忽略不需要的文件&#xff1a;避免将不必要的文件&#xff08;如编译生成的文件、临时文件、日志文件等&#xff09;提交到代码仓库。保护敏感信息&#xff1a;防止本地配置文件&#xff08;如数据库配置文件、API 密钥等&…

阅读笔记——《代码整洁之道》ch2

引言 clean-code ch2阅读笔记 有意义的命名 名副其实 选择体现本意的名称能让人更容易理解和修改代码。 避免误导 怎么能知道该调用哪个函数呢? getActiveAccount(); getActiveAccounts(); getActiveAccountInfo();moneyAmount与money没区别,customerInfo与customer没区别。…

代码随想录-算法训练营day39【动态规划02:不同路径】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part02● 62.不同路径 ● 63. 不同路径 II 今天开始逐渐有 dp的感觉了&#xff0c;题目不多&#xff0c;就两个 不同路径&#xff0c;可以好好研究一下详细布置 62.不同路径 本题大家掌握动态规划的方…

Elasticsearch 搜索引擎实现对文档内容进行快速检索(保姆级教程)

本文主要讲解ES如何从提取文档中提取内容&#xff08;word、pdf、txt、excel等文件类型&#xff09;&#xff0c;实现快速检索文档内容实现。 特别说明一下&#xff0c;为什么用7.10.0版本&#xff0c;因为在项目中除了精确匹配的要求&#xff0c;也会有模糊查询&#xff08;关…

Android 异常开机半屏重启代码分析

Android 的稳定性是 Android 性能的一个重要指标&#xff0c;它也是 App 质量构建体系中最基本和最关键的一环&#xff1b;如果应用经常崩溃&#xff0c;或者关键功能不可用&#xff0c;那显然会对我们的留存产生重大影响所以为了保障应用的稳定性&#xff0c;我们首先应该树立…

在vue3+typescript中使用d3 version 7注意的地方

前几天在做一个前端项目&#xff0c;需要在一个vue3typescript的项目中使用d3 上次做vue2d3v5的项目已经很多年了&#xff0c;这次不仅是vue3&#xff0c;用的typescript&#xff0c;而且d3也升级到v7了&#xff0c;有很多东西不一样了。 这里记录一下&#xff0c;避免日后忘…

go-Expect-实验

实验脚本程序 test.sh read -p "Would you like to rejoin it to the cluster? [y/N]:" v echo if [ "$v" "y" ];thenecho "$(date %s)shark A" >> ./test.log fi read -p "Would you like to rejoin it to the cluste…