【C++中STL】list链表

List链表

  • 基本概念
  • 构造函数
  • 赋值和交换
  • 大小操作
  • 插入和删除
  • 数据存取
  • 反转和排序

基本概念

将数据进行链式存储
链表list是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,链表是由一系列结点组成,结点的组成一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向循环链表。更深层次的理解可以看看数据结构中的链表。
优点:可以对任意的位置进行快速插入或删除元素。
缺点:容器遍历速度,没有数组快,占用的空间比数组大。
数组的优缺点和链表相反。
在这里插入图片描述
在这里插入图片描述
在链表中在任意位置插入和删除元素不会造成原有list迭代器的失效,这个在vector中不成立。
总结:STL中list和vector是两个最常被使用的容器,各有优缺点。

构造函数

1、list lst;默认构造函数形式,采用模板类实现
2、list(beg,end);构造函数将[beg,end]区间中的元素拷贝给本身
3、list(n,elem);构造函数将n个elem拷贝给本身
4、list(const list &lst);拷贝构造函数

void test1() {list<int> l;l.push_back(123);l.push_back(50);l.push_back(34);l.push_back(111);p(l);list<int>l2(l.begin(), l.end());p(l2);list<int>l3(5, 50);p(l3);list<int>l4(l3);p(l4);
}

赋值和交换

1、assign(beg,end);将[beg,end]区间中的元素拷贝给本身
2、assign(n,elem);将n个elem赋值给本身
3、list& operator=(const list &lst);重载等号操作符
4、swap(lst);将lst和本身的元素互换

void test1() {...list<int>l2;l2.assign(l.begin(), l.end());list<int>l3;l3.assign(5, 50);list<int>l4;l4 = l3;l3.swap(l2);
...
}

大小操作

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

if (!l.empty()) {cout << "大小" << l.size()<<endl;}l.resize(6,10);cout << "大小" << l.size() << endl;

插入和删除

1、push_back(ele);尾部插入元素ele
2、push_front();在头部插入一个数据
4、pop_back();删除最后一个元素
5、pop_front();删除第一个元素
6、insert(pos,ele);迭代器指向位置pos插入元素ele的拷贝,返回新数据的位置
7、insert( pos,n,ele);迭代器指向位置pos插入n个元素ele,无返回值
8、insert(pos,beg,end);在pos位置插入[beg,end)区间的数据,无返回值
9、erase(pos);删除pos位置的元素,返回下一个数据的位置
10、erase(beg,end);删除迭代器从start到end之间的元素,返回下一个数据的位置
11、clear();删除容器中的所有元素
12、remove(elem);删除容器中所有与elem值相匹配的元素

void test1() {list<int> l;l.push_back(123);l.push_back(50);p(l);l.erase(l.begin(), l.end());l.push_front(34);l.push_front(111);p(l);l.pop_back();l.pop_front();p(l);l.insert(l.begin(), 99);l.insert(l.begin()++, 3, 999);l.insert(l.end(), l.begin(), l.end());p(l);l.erase(l.begin());p(l);l.remove(999);p(l);l.clear();p(l);
}

数据存取

不可以使用[]和at访问,因为list链表不是连续性空间存储数据,迭代器不支持随机访问。
1、front();返回第一个元素
2、back();返回最后一个元素

void test1() {...cout << "第一个元素" << l.front() << endl;cout << "最后一个元素" << l.back() << endl;
}

反转和排序

1、reverse();反转
2、sort();排序

void test1() {list<int> l;l.push_back(123);l.push_back(50);l.push_front(34);l.push_front(111);//所有不支持随机访问迭代器的容器,不可以用标准算法//不支持随机访问迭代器的容器会内部会提供对应的一些算法sort(l.begin(), l.end());//运行时会报错//不属于全局函数,相当于成员函数,默认从小到大l.sort();p(l);l.sort(myCompare);p(l);l.reverse();p(l);
}

自定义类排序

class S {
public:int age;string name;int h;S(string _n, int _a,int _h) {name = _n;age = _a;h = _h;}
};
//降序排序
bool CompareS(S v1,S v2) {if (v1.age == v2.age) {return v1.h > v2.h;}return v1.age < v2.age;
}
void test1() {list<S> l;S s1("Tom", 18, 187);S s2("Lisa", 20, 165);S s3("LuJy", 34, 190);S s4("Tony", 21, 167);S s5("Ala", 20, 168);l.push_back(s1);l.push_back(s2);l.push_back(s3);l.push_back(s4);l.push_back(s5);for (list<S>::iterator it = l.begin();it != l.end();it++) {cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;}cout << "-----------------------------------------" << endl;l.sort(CompareS);for (list<S>::iterator it = l.begin();it != l.end();it++) {cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;}
}

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

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

相关文章

深度强化学习(王树森)笔记04

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

字符串和C预处理器

本文参考C Primer Plus第四章学习 文章目录 常量和预处理器const限定符 1. 常量和预处理器 有时&#xff0c;在程序中要使用常量。例如&#xff0c;可以这样计算圆的周长&#xff1a; circumference 3.14159 * diameter; 这里&#xff0c;常量3.14159 代表著名的常量 pi(π)。…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴&#xff0c;梳理了系统的行为需求。但你可能也发现了&#xff0c;其实还有些微妙的业务概念还没有澄清&#xff0c;这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模&#xff0c;需要理论和实践相结合。由于我们的模型有一定的…

自动化测试业务价值思考和观点

对于自动化测试的价值如何体现&#xff0c;我的思考和观点主要有如下2点&#xff1a; 基于团队内部&#xff0c;从解决问题角度出发的技术落地实践和数据度量&#xff1b;基于跨团队合作&#xff0c;从KPI/OKR角度,用度量的数据来支撑你的价值传递&#xff1b; 接下来我会基于…

Rabbitmq调用FeignClient接口失败

文章目录 一、框架及逻辑介绍1.背景服务介绍2.问题逻辑介绍 二、代码1.A服务2.B服务3.C服务 三、解决思路1.确认B调用C服务接口是否能正常调通2.确认B服务是否能正常调用A服务3.确认消息能否正常消费4.总结 四、修改代码验证1.B服务异步调用C服务接口——失败2.将消费消息放到C…

二叉树的最近公共祖先,二叉搜索树的最近公共祖先(同一个思路)

目录 二叉树的最近公共祖先方法一&#xff08;时间复杂度O(N^2)&#xff09;方法二&#xff08;时间复杂度O(N)&#xff09; 二叉搜索树的最近公共祖先 二叉树的最近公共祖先 题目链接   二叉树的最近公共祖先   给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。  …

[BUUCTF]-PWN:babyfengshui_33c3_2016解析

又是一道堆题&#xff0c;先看保护 关键信息是32位&#xff0c;没开pie 直接看ida 大致是alloc创建堆块&#xff0c;free释放堆块&#xff0c;show查看堆块内容&#xff0c;fill填充堆块内容 其他的都没啥关键的要讲&#xff0c;但alloc那里非常需要解析一下 解释如上图 再具…

网站将http升级到https大概要多少费用

随着网络安全意识的不断提升&#xff0c;越来越多的网站正从传统的HTTP协议转向更安全的HTTPS协议。这一转变的核心在于部署SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;以实现数据加密传输&#x…

phar反序列化漏洞

基础&#xff1a; Phar是一种PHP文件归档格式&#xff0c;它类似于ZIP或JAR文件格式&#xff0c;可以将多个PHP文件打包成一个单独的文件&#xff08;即Phar文件&#xff09;。 打包后的Phar文件可以像普通的PHP文件一样执行&#xff0c;可以包含PHP代码、文本文件、图像等各…

微信小程序(十八)组件通信(父传子)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.组件属性变量的定义 2.组件属性变量的默认状态 3.组件属性变量的传递方法 解释一下为什么是父传子&#xff0c;因为组件是页面的一部分&#xff0c;数据是从页面传递到组件的&#xff0c;所以是父传子&#xf…

SpringMVC第六天(拦截器)

概念 拦截器(Interceptor)是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行 作用&#xff1a; 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 拦截器与过滤器的区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0c;I…

k8s从初识到上天系列第二篇:kubernetes的组件和架构

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff01; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、SpringSecurity、Docker、Grpc、各种MQ、Rpc、SpringCloud等等很多应用和源码…