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

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

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

一,list的使用

我们废话不多说,直接开始介绍list的使用

list也和vector一样由类模板生成,使用时指定存储的数据类型,但是不同的是,list的底层空间不是连续的,而是双向链表。相比其他的容器,list的插入删除效率更高。

1. 构造&拷贝构造

cpp 复制代码
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 的迭代器是底层连续的,但是迭代器可以类似指针一样使用,在模拟实现部分我们会重点讲解。

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

list也可以用范围for来遍历

cpp 复制代码
for(auto e : l){
	cout<<e<<" ";
}

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

3. 容量相关

容量相关的部分这两个部分比较常用,模拟实现的时候我们也只实现这几个主要的接口:

4. 增删查改


这里先说insert

insert和vector一样要传入迭代器位置作为参数,也可以传入一段迭代器区间作为参数。


erase()传入的也是迭代器位置或者一段迭代器区间进行删除。


头插push_front()传入值就可以,list的底层链表结构支持其可以头插头删


尾删pop_front()

cpp 复制代码
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<<" ";
}

二,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的模拟实现和迭代器失效等问题我们在下一节进行讲解

相关推荐
2401_857439692 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna2 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_2 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
Dream_Snowar3 小时前
速通Python 第三节
开发语言·python
唐诺3 小时前
几种广泛使用的 C++ 编译器
c++·编译器
高山我梦口香糖4 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
信号处理学渣5 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin