【C++】STL容器List的使用vector和list的对比

news/2024/7/2 1:20:57 标签: c++, list, 开发语言

STL容器List使用介绍&vector和list的对比

  • 一,list的使用
    • 1. 构造&拷贝构造
    • 2. 迭代器
    • 3. 容量相关
    • 4. 增删查改
  • 二,list对比vector
    • 1. 结构
    • 2. 访问方式
    • 3. 插入删除
    • 4. 空间利用率
    • 5. 迭代器
    • 6. 迭代器失效问题
    • 7. 使用场景

list_1">一,list的使用

我们废话不多说,直接开始介绍list的使用
在这里插入图片描述
list也和vector一样由类模板生成,使用时指定存储的数据类型,但是不同的是,list的底层空间不是连续的,而是双向链表。相比其他的容器,list的插入删除效率更高。

1. 构造&拷贝构造

在这里插入图片描述

list<int> l1;
list<int> l2(10,1);//用n个值初始化

vector<int> v = {1,2,3,4};
list<int> l3(v.begin(),v.end());//迭代器构造

list<int> l4(1);

2. 迭代器

在这里插入图片描述
list的底层是双向链表,所以其迭代器不像 vector 和 string 的迭代器是底层连续的,但是迭代器可以类似指针一样使用,在模拟实现部分我们会重点讲解。

list<int> l = {1,2,3,4};
list<int>::iterator it = l.begin();
while(it != l.end()){
	cout<<*it<<" ";
	++it;
}

list也可以用范围for来遍历

for(auto e : l){
	cout<<e<<" ";
}

这里需要注意的是list的反向迭代器的位置和其他容器也不同

在这里插入图片描述

3. 容量相关

在这里插入图片描述
容量相关的部分这两个部分比较常用,模拟实现的时候我们也只实现这几个主要的接口:
在这里插入图片描述

4. 增删查改

在这里插入图片描述


这里先说insert
在这里插入图片描述
insert和vector一样要传入迭代器位置作为参数,也可以传入一段迭代器区间作为参数。


在这里插入图片描述
erase()传入的也是迭代器位置或者一段迭代器区间进行删除。


头插push_front()传入值就可以,list的底层链表结构支持其可以头插头删
在这里插入图片描述


尾删pop_front()
在这里插入图片描述

list<int> l;
l.push_front(1);
l.push_front(2);
l.push_front(3);
l.push_front(4);
for(auto e : l){
	cout<<e<<" ";
}

l.pop_front();
for(auto e : l){
	cout<<e<<" ";
}

listvector_90">二,list对比vector

1. 结构

vector底层是动态顺序表,一段连续的空间

list底层是带头双向循环链表

2. 访问方式

vector支持随机访问,访问某个元素效率O(1)

list不支持随机访问,访问某个元素效率O(N)

3. 插入删除

vector任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低。

list任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)

4. 空间利用率

vector底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高

list底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低

5. 迭代器

vector的迭代器是原生指针

list的迭代器是对原生指针(节点指针)进行封装

6. 迭代器失效问题

vector在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值否则会失效

list插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响

7. 使用场景

vector需要高效存储,支持随机访问,不关心插入删除效率

list大量插入和删除操作,不关心随机访问


具体的list的模拟实现和迭代器失效等问题我们在下一节进行讲解


http://www.niftyadmin.cn/n/5417836.html

相关文章

Joe主题网站

一款博客网站源码 发现源码为大家内置了主题 清爽又强大真正的永久可用的一条源码&#xff0c;该版本为整合版本&#xff0c;内置了Joe主题&#xff0c;搭建后直接启用即可~ 安装环境要求&#xff1a; PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff0c;…

云原生构建 微服务、容器化与容器编排

第1章 何为云原生&#xff0c;云原生为何而生 SOA也就是面向服务的架构 软件架构的发展主要经历了集中式架构、分布式架构以及云原生架构这几代架构的发展。 微服务架构&#xff0c;其实是SOA的另外一种实现方式&#xff0c;属于SOA的子集。 在微服务架构下&#xff0c;系统…

解释区块链技术的应用场景、优势及经典案例

目录 1.区块链应用场景 2.区块链优势 3.区块链经典案例 区块链技术是一种分布式账本技术&#xff0c;它通过加密和安全验证机制&#xff0c;允许网络中的多个参与者之间进行可信的、不可篡改的交易和数据的记录与传输。区块链技术的应用场景广泛&#xff0c;其优势也十分显著…

376. 摆动序列(力扣LeetCode)

文章目录 376. 摆动序列题目描述贪心算法 376. 摆动序列 题目描述 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动…

arcgis 栅格数据处理1——无法执行所选工具

问题显示 选中“自定义”——“扩展模块”&#xff0c;能选的选中即可

C++vector简单实现

由于我们之前已经详细讲解了string接口&#xff0c;而vector接口大都在string上有&#xff0c;所以大家只需自行翻阅前面文章就可以明白接口的使用了&#xff0c;所以&#xff0c;这里我们只实现vector&#xff0c;注意&#xff1a;vector会有迭代器失效的情况&#xff0c;大家…

如何变得心智成熟?我推荐你读这5本书

一个人若总是在底层混&#xff0c;说明他的脑子确实不怎么样&#xff0c;一群底层的人聚在一起就更完蛋。 变化是常态&#xff0c;成长是选择。无法否定过去相信的东西&#xff0c;是你最大的障碍。 今天&#xff0c;为大家推荐一份“心智书单”。 01 《打开心智》 李睿秋提…

剑指offer面试题29 数组中出现次数超过一半的数字

考察点 数组知识点 题目 分析 本题目要求数组中出现次数超过一半的数字&#xff0c;其实是需要有一点数学思维&#xff0c;遍历数组&#xff0c;假设第一个元素就是超过一半的元素&#xff0c;并且记录元素出现的次数times&#xff0c;当遇到跟他一样的元素的时候times&…