【STL】list介绍(附与vector的比较)

文章目录

  • 1.关于list
  • 2.使用
    • 2.1 list的构造
    • 2.2 list 迭代器的使用
    • 2.3 list 容量操作
      • 2.3.1 size()
      • 2.3.2 empty()
      • 2.3.3 resize()
    • 2.4 list 元素访问
      • 2.4.1 front()
      • 2.4.2 back()
    • 2.5 list 修改操作
      • 2.5.1 push_front()
      • 2.5.2 pop_front()
      • 2.5.3 push_back()
      • 2.5.4 pop_back()
      • 2.5.5 insert()
      • 2.5.6 erase()
      • 2.5.7 swap()
      • 2.5.8 clear()
    • 2.6其它
      • 2.6.1 remove()
      • 2.6.2 remove_if()
      • 2.6.3 unique()
      • 2.6.4 sort()
      • 2.6.5 merge()
      • 2.6.6 reverse()
  • 3. vector和list对比

1.关于list

​ list也是STL提供的一个容器,其底层是一个带头双向循环链表,因此,其优缺点如下:

优点:

  1. 插入和删除效率高:在链表的任意位置插入或删除元素的时间复杂度为 O (1),这使得list在需要频繁插入和删除元素的场景下非常高效。
  2. 内存管理灵活list的元素在内存中不是连续存储的,因此可以灵活地分配和释放内存,避免了内存碎片的问题。

缺点:

  1. 随机访问效率低:由于list是双向链表,不支持随机访问,要访问第 n 个元素,需要从头或尾开始遍历链表。
  2. 空间开销大:每个元素除了存储自身的数据外,还需要额外的指针来指向前一个和后一个元素,因此空间开销较大。

在这里插入图片描述

2.使用

​ 这里也只介绍常用的一些接口。

2.1 list的构造

1.声明及说明

构造函数声明说明
list(size_type n,const value_type& val = value_type())构造包含n个val元素的list
list()构造空的list
list(const list& x)拷贝构造
list (InputIterator first, InputIterator last)[first,last)区间元素构造

2.示例

#include <iostream>
#include <list> //注意包含头文件<list>
using namespace std;template <class T>
void print_list(list<T>& lt)
{for (auto& e : lt){cout << e << " ";}cout << endl;
}void list_test1()
{list<int> lt1;                         // 构造空的lt1list<int> lt2(5, 10);                 // 4个值为10的元素构造lt2list<int> lt3(lt2.begin(), lt2.end()); // 用lt2的[begin(), end())区间构造lt3list<int> lt4(lt3);                    // 用lt3拷贝构造lt4list<int> lt5{ 1,2,3,4,5 };           //列表格式构造 C++11支持print_list(lt1);//  print_list(lt2);//10 10 10 10 10print_list(lt3);//10 10 10 10 10print_list(lt4);//10 10 10 10 10print_list(lt5);//1 2 3 4 5
}int main()
{list_test1();return 0;
}

2.2 list 迭代器的使用

1.声明及说明

声明说明
begin() + end()返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin() + rend()返回反向第一个元素的reverse_iterator,返回反向最后一个元素下一个位置的reverse_iterator

在这里插入图片描述

2.示例

void list_test2()
{list<int> lt{ 1,2,3,4,5 };           //列表格式构造 C++11支持list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";++it;}cout << endl;//输出:1 2 3 4 5list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";++rit;}cout << endl;//输出:5 4 3 2 1
}int main()
{list_test2();return 0;
}

2.3 list 容量操作

2.3.1 size()

1.声明及功能

声明功能
size_type size() const返回list内有效元素个数

2.示例

void list_test3()
{list<int> lt{ 1,2,3,4,5 };cout << lt.size() << endl;  //5
}int main()
{list_test3();return 0;
}

2.3.2 empty()

1.声明及功能

声明功能
bool empty() const检测list是否为空

2.示例

void list_test4()
{list<int> lt1;list<int> lt2{ 1,2,3,4,5 };if (lt1.empty()){cout << "lt1 is empty" << endl;}else{cout << "lt1 is not empty" << endl;}//输出:lt1 is emptyif (lt2.empty()){cout << "lt2 is empty" << endl;}else{cout << "lt2 is not empty" << endl;}//输出:lt2 is not empty
}int main()
{list_test4();return 0;
}

2.3.3 resize()

1.声明及功能

声明功能
void resize (size_type n);将list的size调整为n。如果n大于当前list的size(),则在列表末尾插入默认构造的元素。如果n小于当前list的size(),则删除超出n的元素。
void resize (size_type n, const value_type& val);将list的size调整为n。如果n大于当前列表的size(),则在列表末尾插入足够数量的值为val的元素。如果n小于当前列表的大小,则删除超出n的元素。

2.示例

void list_test5()
{list<int> lt1(5, 1);list<int> lt2(5, 2);print_list(lt1);//1 1 1 1 1print_list(lt2);//2 2 2 2 2lt1.resize(10, 2);print_list(lt1);//1 1 1 1 1 2 2 2 2 2lt1.resize(2, 0);print_list(lt1);//1 1lt2.resize(1);print_list(lt2);//2lt2.resize(10);print_list(lt2);//2 0 0 0 0 0 0 0 0 0 }int main()
{list_test5();return 0;
}

2.4 list 元素访问

2.4.1 front()

1.声明及功能

声明功能
reference front();返回list第一个节点的值的引用

2.示例

void list_test6()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5++lt.front();//2 2 3 4 5print_list(lt);}
int main()
{list_test6();return 0;
}

2.4.2 back()

1.声明及功能

声明功能
reference back();返回list的最后一个节点中值的引用

2.示例

void list_test7()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5--lt.back();print_list(lt);//1 2 3 4 4}
int main()
{list_test7();return 0;
}

2.5 list 修改操作

2.5.1 push_front()

1.声明及功能

声明功能
void push_front (const value_type& val);在list首元素前插入值为val的元素

2.示例

void list_test8()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.push_front(0);print_list(lt);//0 1 2 3 4 5}
int main()
{list_test8();return 0;
}

2.5.2 pop_front()

1.声明及功能

声明功能
void pop_front();删除list中第一个元素

2.示例

void list_test9()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5 lt.pop_front();print_list(lt);//2 3 4 5}
int main()
{list_test9();return 0;
}

2.5.3 push_back()

1.声明及功能

声明功能
void push_back (const value_type& val);在list尾部插入值为val的元素

2.示例

void list_test10()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);print_list(lt);//1 2 3 4 5
}
int main()
{list_test10();return 0;
}

2.5.4 pop_back()

1.声明及功能

声明功能
void pop_back();删除list中最后一个元素

2.示例

void list_test11()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.pop_back();lt.pop_back();lt.pop_back();lt.pop_back();print_list(lt);//1}
int main()
{list_test11();return 0;
}

2.5.5 insert()

1.声明及功能

声明功能
iterator insert (iterator position, const value_type& val);在position位置前插入值为val的元素
void insert (iterator position, size_type n, const value_type& val);在position位置前插入n个值为val的元素
template < class InputIterator > void insert (iterator position, InputIterator first, InputIterator last);在position位置前插入指定区域[first,last)对应值的元素

2.示例

void list_test12()
{list<int> lt{ 1,2,3,4,5 };list<int> lt1{ 1,1,1,1,1 };print_list(lt);//1 2 3 4 5list<int>::iterator it = ++lt.begin();lt.insert(it, 0);print_list(lt);//1 0 2 3 4 5lt.insert(lt.begin(), 3, 0);print_list(lt);//0 0 0 1 0 2 3 4 5lt.insert(lt.begin(), lt1.begin(), lt1.end());print_list(lt);//1 1 1 1 1 0 0 0 1 0 2 3 4 5
}
int main()
{list_test12();return 0;
}

2.5.6 erase()

1.声明及功能

声明功能
iterator erase (iterator position);删除position位置的值,并返回position下一个位置的iterator
iterator erase (iterator first, iterator last);删除指定区间[first,last)的元素并返回last位置的iterator

在这里插入图片描述

2.示例

void list_test13()
{list<int> lt{ 1,2,3,4,5,6,7,8,9,10 };print_list(lt);//1 2 3 4 5 6 7 8 9 10list<int>::iterator it1 = lt.begin();while (it1 != lt.end()){if (*it1 == 5){it1 = lt.erase(it1); //it指向值为6的位置cout << *it1 << endl;//6continue;}it1++;}print_list(lt);//1 2 3 4 5 7 8 9 10list<int>::iterator first = ++lt.begin();//指向2的位置list<int>::iterator last = --lt.end(); //指向10的位置list<int>::iterator it2 = lt.erase(first, last);//删除[first,last) it2指向last的位置即9的位置cout << *it2 << endl;//10print_list(lt);//1 10
}
int main()
{list_test13();return 0;
}

2.5.7 swap()

1.声明及功能

声明功能
void swap (list& x);交换两个list

2.示例

void list_test14()
{list<int> lt1{ 1,2,3,4,5 };list<int> lt2{ 5,4,3,2,1 };print_list(lt1);//1 2 3 4 5print_list(lt2);//5 4 3 2 1lt1.swap(lt2);print_list(lt1);//5 4 3 2 1print_list(lt2);//1 2 3 4 5
}
int main()
{list_test14();return 0;
}

2.5.8 clear()

1.声明及功能

声明功能
void clear();清空list中的有效元素(不包括头节点)

2.示例

void list_test15()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.clear();print_list(lt);// 
}
int main()
{list_test15();return 0;
}

2.6其它

2.6.1 remove()

1.声明及功能

声明功能
void remove (const value_type& val);删除值为val的元素

2.示例

void list_test16()
{list<int> lt{ 10,20,30,40,50 };print_list(lt);//10 20 30 40 50lt.remove(30);//有30则删除print_list(lt);//10 20 40 50lt.remove(1);//无1则不删除print_list(lt);//10 20 40 50}
int main()
{list_test16();return 0;
}

2.6.2 remove_if()

1.声明及功能

声明功能
template < class Predicate> void remove_if (Predicate pred);删除满足()中条件的值,其中可以是函数指针或者函数对象

2.示例

bool if_even(int n)
{return n % 2 != 0;
}void list_test17()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.remove_if(if_even);//删除奇数print_list(lt);//2 4
}
int main()
{list_test17();return 0;
}

2.6.3 unique()

1.声明及功能

声明功能
void unique();删除list中连续重复的值,一段连续值只保留一个(注意区分,不是完全去重)

2.示例

void list_test18()
{list<int> lt{ 1,1,1,2,2,2,3,3,4,5,5 };print_list(lt);//1 1 1 2 2 2 3 3 4 5 5 lt.unique();//连续重复的数,仅保留一个print_list(lt);//1 2 3 4 5 list<int> lt1{ 1,1,1,2,2,2,1,1,2,2,3,3,4,5,5 };print_list(lt1);1 1 1 2 2 2 1 1 2 2 3 3 4 5 5 lt1.unique();print_list(lt1);//1 2 1 2 3 4 5
}int main()
{list_test18();return 0;
}

2.6.4 sort()

1.声明及功能

声明功能
void sort();默认按升序排序
template < class Compare> void sort (Compare comp);按comp方法进行排序

2.示例

struct cmp
{bool operator()(int a,int b) {return a > b;}
};
void list_test19()
{list<int> lt{ 3,1,2,5,4,0,2 };print_list(lt);//3 1 2 5 4 0 2lt.sort();//默认升序排列print_list(lt);//0 1 2 2 3 4 5lt.sort(cmp());//自定义降序排列print_list(lt);//5 4 3 2 2 1 0
}
int main()
{list_test19();return 0;
}

2.6.5 merge()

1.声明及功能

声明功能
void merge (list& x);合并两个list为一个有序的list(仅适用于两个已排序的list(升序))

2.示例

void list_test20()
{list<int> lt1{ 1,2,6,4,5 };list<int> lt2{ 0,4,21,3,4 };lt1.sort();lt2.sort();lt1.merge(lt2);//将lt2合并到lt1中,合并成一个升序listprint_list(lt1);//0 1 2 3 4 4 4 5 6 21print_list(lt2);//
}
int main()
{list_test20();return 0;
}

2.6.6 reverse()

1.声明及功能

声明功能
void reverse();翻转list

2.示例

void list_test21()
{list<int> lt{ 1,2,3,4,5 };print_list(lt);//1 2 3 4 5lt.reverse();print_list(lt);//5 4 3 2 1
}
int main()
{list_test21();return 0;
}

3. vector和list对比

对比vectorlist
底层结构动态顺序表带头双向循环链表
访问支持随机访问,可使用首地址+下标,[]形式不能随机访问
插入删除任意位置插入删除效率较低,需挪动元素任意位置插入删除效率较高
空间利用率底层为连续空间,空间利用率高,缓存利用率高节点动态开辟,容易造成内存碎片,空间利用率低,缓存利用率低
迭代器原生态指针指针进行了封装
迭代器失效容器相关操作都可能导致迭代器失效,如插入引起扩容、删除元素等时插入元素不会导致迭代器失效,删除节点会导致且只影响当前迭代器
使用场景想进行随机访问,不关心插入删除效率时有大量插入删除场景,不在意随机访问效率时

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

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

相关文章

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…

SQL:DDL(数据定义语言)和DML(数据操作语言)

目录 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09; DDL和DML的区别 什么是SQL&#xff1f; SQL&#xff08;Structured …

Chrome 135 版本开发者工具(DevTools)更新内容

Chrome 135 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、性能&#xff08;Performance&#xff09;面板改进 1. 性能面板中的配置文件和函数调用现已显示来源和脚本链接 Performance > Summary&#xff08;性能 > 概览&#xff09;选项卡现在会显示配…

[ctfshow web入门] web23

前置知识 include&#xff1a;包含一个文件&#xff0c;也可以包含一些其他东西&#xff0c;后续用到再解析 substr&#xff1a;对字符串进行切片&#xff0c;第一个参数是字符串&#xff0c;第二第三个参数出从第a个索引开始切n个&#xff0c;索引从0开始计数。 例如&#xf…

vue3 开发电子地图功能

文章目录 一、项目背景二、页面效果三、代码1.ElectronicMap.vue2.TransferDeskRSSIMap.vue3.Map.js4.src/stores/index.js Vuex存储属性 四、注意点本人其他相关文章链接 一、项目背景 项目采用&#xff1a;vue3javaArco DesignSpringBootOpenStreetMap 数据的地图切片服务。…

oracle 存储体系结构

oracle 存储体系结构 参考&#xff1a; Logical Storage Structures (oracle.com)

python-leetcode 66.寻找旋转排序数组中的最小值

题目&#xff1a; 已知一个长度为n的数组&#xff0c;预先按照升序排列&#xff0c;经由1到n次旋转后&#xff0c;得到输入数组&#xff0c;例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若…

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法(有目标函数)

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法&#xff08;有目标函数&#xff09; 一、方法概述 扩展傅里叶幅度敏感性检验&#xff08;EFAST&#xff09;是一种基于频域分析的全局敏感性分析方法&#xff0c;能够同时评估模型参数的一阶敏感性&#xff…

Tiktok 关键字 视频及评论信息爬虫(1) [2025.04.07]

&#x1f64b;‍♀️Tiktok APP的基于关键字检索的视频及评论信息爬虫共分为两期&#xff0c;希望对大家有所帮助。 第一期见下文。 第二期&#xff1a;基于视频URL的评论信息爬取 1. Node.js环境配置 首先配置 JavaScript 运行环境&#xff08;如 Node.js&#xff09;&#x…

【愚公系列】《高效使用DeepSeek》058-选题策划

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

零基础教程:Windows电脑安装Linux系统(双系统/虚拟机)全攻略

一、安装方式选择 方案对比表 特性双系统安装虚拟机安装性能原生硬件性能依赖宿主机资源分配磁盘空间需要独立分区&#xff08;建议50GB&#xff09;动态分配&#xff08;默认20GB起&#xff09;内存占用独占全部内存需手动分配&#xff08;建议4GB&#xff09;启动方式开机选…

LeetCode 2968.执行操作使频率分数最大

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] 增加 或者 减少 1 。 最终数组的频率分数定义为数组中众数的 频率 。 请你返回你可以得到的 最大 频率分数。 众数指的…

excel经验

Q:我现在有一个excel&#xff0c;有一列数据&#xff0c;大概两千多行。如何在这一列中 筛选出具有关键字的内容&#xff0c;并输出到另外一列中。 A: 假设数据在A列&#xff08;A1开始&#xff09;&#xff0c;关键字为“ABC”在相邻空白列&#xff08;如B1&#xff09;输入公…

HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口

文章目录 HTTP查询参数请求示例接口文档——获取城市列表代码示例效果 带查询参数的HTTP接口示例——以python flask接口为例app.pyREADME.md运行应用API示例客户端示例关键实现说明&#xff1a;运行方法&#xff1a; HTTP查询参数请求示例 接口文档——获取城市列表 代码示例…

将飞帆制作的网页作为 div 集成到自己的网页中

并且自己的网页可以和飞帆中的控件相互调用函数。效果&#xff1a; 上链接 将飞帆制作的网页作为 div 集成到自己的网页中 - 文贝 进入可以复制、运行代码

Redis主从复制:告别单身Redis!

目录 一、 为什么需要主从复制&#xff1f;&#x1f914;二、 如何搭建主从架构&#xff1f;前提条件✅步骤&#x1f4c1; 创建工作目录&#x1f4dc; 创建 Docker Compose 配置文件&#x1f680; 启动所有 Redis&#x1f50d; 验证主从状态 &#x1f4a1; 重要提示和后续改进 …

k8s 1.30.6版本部署(使用canal插件)

#系统环境准备 参考 https://blog.csdn.net/dingzy1/article/details/147062698?spm1001.2014.3001.5501 #配置下载源 curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyri…

机器学习的一百个概念(7)独热编码

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

RHCSA复习

在Linux中&#xff0c; wrx 分别代表写&#xff08;write&#xff09;、读&#xff08;read&#xff09;和执行&#xff08;execute&#xff09;权限&#xff0c;它们对应的权限值分别是&#xff1a; - r &#xff08;读权限&#xff09;&#xff1a;权限值为4。 - w &am…

“乐企“平台如何重构业财税票全流程生态?

2025年&#xff0c;国家税务总局持续推进的"便民办税春风行动"再次推进数字化服务升级&#xff0c;其中"乐企"平台作为税务信息化的重要载体&#xff0c;持续优化数电票服务能力&#xff0c;为企业提供更高效、更规范的税务管理支持。在这一背景下&#xf…