20230507,LIST容器

学了又忘学了又忘,明知道会忘又不想复习又还得学

LIST容器

1.1 基本概念

 链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序通过链表中的指针链接实现的;链表由一系列结点组成
结点:一个是存储数据元素的数据域,一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表,迭代器只支持前移和后移(不支持跳跃式访问),属于双向迭代器

优点:可以对任意位置进行快速插入或删除元素,操作方便,修改指针即可,不需要移动大量元素;动态内存分配,不会造成内存浪费和溢出
缺点:容器遍历速度没有数组快,占用空间比数组灵活,但空间(指针域)和时间(遍历)额外耗费巨大

LIST有一个重要的性质,插入和删除都不会造成原有LIST迭代器的失效,这在VECTOR里面是不成立的
STL中LIST和VECTOR是两个最常使用容器,各有优缺点

1.2 构造函数

 list<T> lst;             //采用模板类实现,对象的默认构造形式
list(beg,end);            //首尾区间拷贝
list(n,elem);             //N个ELEM拷贝
list(const list &lst);    //拷贝构造函数

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
list<T> lst;             //采用模板类实现,对象的默认构造形式
list(beg,end);            //首尾区间拷贝
list(n,elem);             //N个ELEM拷贝
list(const list &lst);    //拷贝构造函数
*/
void printl(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;            // list<T> lst;l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);printl(l);list<int>l2(l.begin(), l.end());printl(l2);list<int>l3(5,100);printl(l3);list<int>l4(l);printl(l4);
}
int main() {test01();system("pause");return 0;
}
1.3 赋值和交换

 assign(beg,end);
assign(n,elem)
list &operator=(const list &lst);
swap(lst)

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
assign(beg,end);
assign(n,elem)
list &operator=(const list &lst);
swap(lst)
*/
void printl(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;            // list<T> lst;l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);printl(l);list<int>l2;l2.assign(l.begin(), l.end());printl(l2);l2.assign(9, 78);printl(l2);cout <<"l2.size()="<< l2.size() << endl;list<int>l3;l3 = l;printl(l3);cout << "l3.size()=" << l3.size() << endl;l3.swap(l2);printl(l2);cout << "l2.size()=" << l2.size() << endl;printl(l3);cout << "l3.size()=" << l3.size() << endl;
}
int main() {test01();system("pause");return 0;
}
1.4 大小操作

empty()
size()
lst.resize(n,elem)
lst.resize(n) 

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
empty()
size()
lst.resize(n,elem)
lst.resize(n)
*/
void printl(const list<int>& l) {for (list<int>::const_iterator it = l.begin(); it != l .end(); it++) {cout << *it << " ";}cout << endl;
}
void isempty(const list<int>& l) {if (l.empty()) {cout << "空" << endl;}else {cout << " bubu <" << endl;cout << " size:" << l.size() << endl;}
}
void test01() {list<int>l;            // list<T> lst;isempty(l);l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);printl(l);isempty(l);l.resize(10, 99);printl(l);isempty(l);l.resize(2);printl(l);isempty(l);
}
int main() {test01();system("pause");return 0;
}
1.5 插入和删除——代码有BUG,暂时搞不懂

push_back(elem)    push_front(elem)    pop_back()     pop_front()
insert(pos,elem)返回新数据位置    insert(pos,n,elem)无返回值    insert(n,beg,end)无返回值
cleae()    erase(beg,end)返回下一个数据位置    erase(pos)返回下一个数据位置  
remove(elem)删除容器中所有值与ELEM匹配的元素 

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
push_back(elem)  push_front(elem)  pop_back()   pop_front()
insert(pos,elem)返回新数据位置  insert(pos,n,elem)无返回值  insert(n,beg,end)无返回值
cleae()  erase(beg,end)返回下一个数据位置  erase(pos)返回下一个数据位置  
remove(elem)删除容器中所有值与ELEM匹配的元素
*/
void printl(const list<int>& l) {for (list<int>::const_iterator i = l.begin(); i != l .end(); i++) {cout << *i<< " ";}cout << endl;
}
void isempty(const list<int>& l) {if (l.empty()) {cout << "空" << endl;}else {cout << " bubu <" << endl;cout << " size:" << l.size() << endl;}
}
void test01() {list<int>l;         l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);l.push_front(111);l.push_front(222);l.push_front(333);printl(l);isempty(l);l.pop_back();l.pop_front();printl(l);list<int>::iterator it = l.begin();//l.insert(it,10000);it++;//cout << it << endl;l.insert(it, 4);//在第 1 个位置后面 插入,返回新数据位置 2printl(l);it++;//it--2,it++=3l.insert(it, 99,3);//在第 3 个位置后面 插入,it= 4+99=103printl(l);l.insert(it,l.begin(),l.end());//在第 it 个位置后面 插入printl(l);l.erase(it);printl(l);//l.erase(it);//加上就报错,说无效参数传……*&&(*&(……//l.erase(l.end());//l.remove(3);printl(l);l.erase(l.begin());printl(l);l.clear();printl(l);
}
int main() {test01();system("pause");return 0;
}
1.6 数据存取

front()          back(),不支持中括号的方式访问,本质是链表,因为不是连续的线性空间存储数据,迭代器也不支持随机访问
++,--就是支持双向,+N就是支持随机

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
front()          back()
*/
void printl(const list<int>& l) {for (list<int>::const_iterator i = l.begin(); i != l .end(); i++) {cout << *i<< " ";}cout << endl;
}
void isempty(const list<int>& l) {if (l.empty()) {cout << "空" << endl;}else {cout << " bubu <" << endl;cout << " size:" << l.size() << endl;}
}
void test01() {list<int>l;         l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);l.push_front(111);l.push_front(222);l.push_front(333);printl(l);isempty(l);cout << l.front() << endl;cout << l.back() << endl;}
int main() {test01();system("pause");return 0;
}
1.7 反转和排序

reverse()//反转链表    sort()链表排序——升序降序

#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;
/*
reverse()//反转链表    sort()链表排序
*/
void printl(const list<int>& l) {for (list<int>::const_iterator i = l.begin(); i != l .end(); i++) {cout << *i<< " ";}cout << endl;
}
bool mycompare(int v1, int v2) {//降序,第一个数,大于,第二个数return v1 > v2;
}
void test01() {list<int>l;         l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);l.push_front(111);l.push_front(222);l.push_front(333);printl(l);l.reverse();printl(l);//sort(l.begin(),l.end());//所有不支持随机访问迭代器的容器,不可以用标准算法//但容器内部会提供对应的一些算法,成员函数l.sort();printl(l);l.sort(mycompare);printl(l);
}
int main() {test01();system("pause");return 0;
}
1.8 排序案例——Person自定义数组类型进行排序,Person(姓名,年龄,身高)
年龄升序,年龄相同身高降序

先指定排序规则,再直接调用

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
Person自定义数组类型进行排序,Person(姓名,年龄,身高)
年龄升序,年龄相同身高降序
*/
class Person {
public:Person(string name, int age, int tall) {this->_name = name;this->_age = age;this->_tall = tall;}
public:string _name;int _age;int _tall;
};
void printl(const list<Person>& l) {for (list<Person>::const_iterator it = l.begin(); it != l .end(); it++) {cout << "选手: " << it->_name << "\t年龄: " << it->_age << "\t身高:" << it->_tall << endl;}cout << endl;
}
void setpp(list<Person>& l) {Person p1("有哈", 18, 180);Person p2("hhki", 16, 190);Person p3("黄金分割", 22, 210);Person p4("会后i", 16, 130);Person p5("经济", 30, 150);l.push_back(p1);l.push_back(p2);l.push_back(p3);l.push_back(p4);l.push_back(p5);
}
void setpp2(list<Person>& l) {srand((unsigned int)time(NULL));string nameseed = "abcde";for (int i = 0; i < 5; i++) {string name = "选手";name += nameseed[i];int age = rand() % 21 + 20;int tall = rand() % 51 + 150;Person p(name, age, tall);l.push_back(p);}
}
//指定排序规则
bool mycompare(Person&p1,Person&p2) {if (p1._age == p2._age) {return p1._tall < p2._tall;}else {return p1._age < p2._age;}
}
void test01() {list<Person>l;         //setpp(l);setpp2(l);printl(l);l.sort(mycompare);printl(l);
}
int main() {test01();system("pause");return 0;
}

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

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

相关文章

Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题 将Electron项目原CommonJS语法改成使用ES 模块&#xff08;ESM&#xff09;语法&#xff0c;preload.js一直加载不到&#xff0c;报错如下&#xff1a; VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js VM111 renderer_init:2 E…

NGINX App Protect现已支持NGINX开源版 全方位加强现代应用安全防护

近日&#xff0c;F5 NGINX 发布全新升级的NGINX App Protect 5.0版本&#xff0c;将先前专属于NGINX 商业版本NGINX Plus 的现代应用安全能力拓展至NGINX开源版中&#xff0c;为增强现代应用和API安全防护提供全方位支持。此次升级后&#xff0c;适用于云端及本地部署的NGINX A…

Dell EMC Storage Unity: Remove/Install Memory Module

SP A 一个内存故障 点击system view -> Enclosures->Top查看 再次查看Alert&#xff0c; 确认内存出现问题 进入Service &#xff0c; 将SP A置为service状态 移出SP A &#xff0c;进行内存更换 更换完内存后&#xff0c;将SP A插入设备&#xff0c;并进行线缆连接 进入…

Maven+Junit5 + Allure +Jenkins 搭建 UI 自动化测试实战

文章目录 效果展示Junit 5Junit 5 介绍Junit 5 与 Junit 4 对比PageFactory 模式编写自动化代码公共方法提取测试用例参数化Jenkins 搭建及配置参数化执行生成 Allure 报告Maven 常用命令介绍POM 文件效果展示 本 chat 介绍 UI 自动化测试框架的搭建: 运用 page factory 模式…

AI大模型探索之路-训练篇16:大语言模型预训练-微调技术之LoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

教育界最厉害的三个名人颜廷利:处处物尽其用, 时时人尽其才

颜廷利教授在他的著作《升命学说》中提出了“净化论”&#xff0c;这一理论**强调了个人内在心灵的宁静与纯洁对于实现更高层次人生价值的重要性**。 “净化论”是中国最受欢迎的著名起名字大师颜廷利教授关于如何提升个人命运和推动社会发展的哲学思考的一部分。他在书中提出&…

Baidu Comate:智能编码助手,助力编程效率飞跃

文章目录 Baidu Comate智能助手简介安装Baidu ComateBaidu Comate主要功能代码智能补全编程知识问答官方插件函数注释行间注释生成单测代码解释调优建议函数拆分清空对话框help AutoWork工具箱 总结 Baidu Comate智能助手简介 Baidu Comate&#xff0c;Coding Mate Powered by …

Express路由

什么是路由 官方定义&#xff1a;路由确定了应用程序如何响应客户端对特定端点的请求。 路由的使用 一个路由的组成有 请求方法、路径 和 回调函数 组成。 Express中提供了一些列方法&#xff0c;可以很方便的使用路由&#xff0c;使用格式如下&#xff1a; app.<metho…

【编程题-错题集】非对称之美(找规律 / 贪心)

牛客对应题目链接&#xff1a;非对称之美 (nowcoder.com) 一、分析题目 找规律&#xff1a; 判断是否全都是相同字符。判断本身是否是回文。 如果这个字符串每个字符相同&#xff0c;不存在非回文子串&#xff0c;直接返回 0。如果这个字符串不是回文&#xff0c;输出字符串长度…

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

STC15W1K16S和VC6.0串口通讯收发测试实例

/********************************************* STC USB 串口板 2014 4 7 20:12 发送接收数据 使用STC串口调试助手通讯正常&#xff0c;L161 **********************************************/ #include "reg51.h" #include "intrins.h" #define…

sourceTree push失败

新电脑选择commit and push&#xff0c;报错了&#xff0c;不过commit成功&#xff0c;只不过push失败了。 原因是这个&#xff0c;PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink&#xff0c;本地没有这个ssh密钥&#xff0c;改换成openSSH&#xff…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

如何理解GTX接收通道相关模块?(高速收发器三)

前文讲解了GTX的时钟及发送通道相关内容&#xff0c;本文讲解GTX接收通道的一些功能及其IP配置&#xff0c;接收往往比发送设计更难&#xff0c;与调制解调&#xff0c;加密解密其实相差不大&#xff0c;后者难度都比前者高出很多。GTX的接收通道的功能相比发送通道更加重要&am…

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

Redis 源码安装(CentOS 单机)

序言 本文给大家介绍如何在 CentOS 上&#xff0c;通过 Redis 源码单机部署 Redis 服务。 一、部署流程 通过官网下载源码 # 下载源码 wget https://download.redis.io/redis-stable.tar.gz# 解压源码包 tar -xzvf redis-stable.tar.gz在 linux 中执行以下命令&#xff0c;安…

百度云内容审核快速配置 (java)

为什么要选择百度云 &#xff1f; 因为他免费用一年 首先要先开通百度云内容安全服务 按照操作指引走完整套 ContentCensor Java SDK目录结构** com.baidu.aip├── auth //签名相关类├── http //Http通…

深度解析DPO及其变体在多种任务上的表现如何,该如何选择

深度学习自然语言处理 原创作者&#xff1a;wkk 单位&#xff1a;亚利桑那州立大学paper&#xff1a;Insights into Alignment:Evaluating DPO and its Variants Across Multiple TasksLink&#xff1a;https://arxiv.org/pdf/2404.14723 今天&#xff0c;我要带大家深入了解一…

Qt在任务栏图标和系统托盘图标上显示红点

在任务栏图标上显示红点 关键类&#xff1a;QWinTaskbarButton #include <QWinTaskbarButton>QPointer<QWinTaskbarButton> taskbarBtn nullptr; if (!taskbarBtn) {taskbarBtn new QWinTaskbarButton(window);taskbarBtn->setWindow(window->windowHand…

git bash退出vim编译模式

解决方法&#xff1a; 1.按esc键&#xff08;回到命令模式&#xff09; 此时是没有分号让我们在后面输入命令的 2.按shift键: 3.再输入&#xff1a;wq&#xff0c;并按enter键 此时我们发现又回到git bash窗口 希望对大家有所帮助&#xff01;