当前位置: 首页 > news >正文

【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函数 )

文章目录

  • 一、 list 双向链表容器简介
    • 1、容器特点
    • 2、容器操作时间复杂度
    • 3、遍历访问
    • 5、头文件
  • 二、 list 双向链表容器 构造函数
    • 1、默认无参构造函数
    • 2、创建包含 n 个相同元素的 list 双向链表
    • 3、使用初始化列表构造 list 双向链表
    • 4、使用另外一个 list 容器 构造 list 双向链表容器






一、 list 双向链表容器简介



1、容器特点


list 双向链表容器 可以在 任意位置 高效的 进行 插入 / 删除 元素 ;

list 双向链表容器 的 元素的指针 : 容器 中的元素 , 包含 2 个指针 , 一个指向该元素的前驱 , 一个指向该元素的后继 ;


2、容器操作时间复杂度


list 双向链表容器 操作时间复杂度 :

  • 头部和尾部插入或删除元素的时间复杂度是 O(1) ;
  • 表中间插入或删除元素 , 最坏情况可能需要移动 n 个元素 , 时间复杂度是 O(n) ;

3、遍历访问


迭代器 : list 双向链表容器 提供了 迭代器 功能 , 可以使用 迭代器 遍历 容器中的元素 ;


list 双向链表容器 不能 随机存储访问 , 也就是 不能 根据下标 获取元素 , 不能使用 at() 函数 和 [] 操作符访问容器中的元素 ;


5、头文件


使用 list 双向链表容器 , 需要导入 <list> 头文件 ;

#include <list>




二、 list 双向链表容器 构造函数



list 双向链表容器 常用操作 , 基本与 vector 相同 , 这里进行简单介绍 ;


1、默认无参构造函数


list 双向链表容器 默认的无参构造函数 , 构造格式如下 :

list<T> lstT

在尖括号中的 T 泛型类型是 list 双向链表 容器中存储的元素类型 ;

lstT 是双向链表容器的 变量名 ;


该默认无参构造函数 会创建空的 list 双向链表 ;


代码示例 :

#include "iostream"
using namespace std;
#include "list"int main() {// 默认无参构造函数 会创建空的 list 双向链表// list 双向链表容器, 存储 int 类型元素list<int> lstInt;// list 双向链表容器, 存储 float 类型元素list<float> lstFloat;// list 双向链表容器, 存储 string 类型元素list<string> lstString;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :
在这里插入图片描述


2、创建包含 n 个相同元素的 list 双向链表


创建包含 n 个相同元素的 list 双向链表 , 构造函数会将 n 个相同的元素 拷贝到 容器中 ;

函数原型如下 :

list(size_type n, const value_type& value = value_type(), const allocator_type& alloc = allocator_type());

该 构造函数会创建一个包含 n 个元素的新列表 , 每个元素的值都初始化为 value ;

如果没有提供 value , 则元素初始化为默认值 , 使用提供的 alloc 来分配内存 ;

如 : 如果是 int 类型的元素 , 则初始化为 0 ;

代码示例 :

	// list 双向链表容器, 存储 3 个 int 类型元素 666list<int> lstInt(3, 666);

完整代码示例 :

#include "iostream"
using namespace std;
#include "list"// 打印 list 容器内容
void printL(list<int>& lst) {// 获取迭代器起始位置list<int>::iterator it = lst.begin();cout << "list 容器内容 : ";// 循环判定, 如果没有迭代到最后一个元素的后一个位置, 那么一直循环while (it != lst.end()){// 获取元素值cout << *it << " ";// 迭代器指向下一个元素it++;}// 回车换行cout << endl;
}int main() {// list 双向链表容器, 存储 3 个 int 类型元素 666list<int> lstInt(3, 666);// 打印 list 容器内容printL(lstInt);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

list 容器内容 : 666 666 666
请按任意键继续. . .

在这里插入图片描述


3、使用初始化列表构造 list 双向链表


使用初始化列表构造 list 双向链表 函数原型如下 :

list(std::initializer_list<value_type> init, const allocator_type& alloc = allocator_type());

该 构造函数会创建一个列表 , 其元素是从 init 初始化器列表复制的 ;

代码示例 :

	// list 双向链表容器 使用初始化列表构造list<int> lstInt{1, 2, 3, 4, 5};

完整代码示例 :

#include "iostream"
using namespace std;
#include "list"// 打印 list 容器内容
void printL(list<int>& lst) {// 获取迭代器起始位置list<int>::iterator it = lst.begin();cout << "list 容器内容 : ";// 循环判定, 如果没有迭代到最后一个元素的后一个位置, 那么一直循环while (it != lst.end()){// 获取元素值cout << *it << " ";// 迭代器指向下一个元素it++;}// 回车换行cout << endl;
}int main() {// list 双向链表容器 使用初始化列表构造list<int> lstInt{1, 2, 3, 4, 5};// 打印 list 容器内容printL(lstInt);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

list 容器内容 : 1 2 3 4 5
请按任意键继续. . .

在这里插入图片描述


4、使用另外一个 list 容器 构造 list 双向链表容器


使用另外一个 list 容器 构造 list 双向链表容器 , 有 3 种方式 :

  • 参数为另一个 list 容器引用 : 构造函数会创建一个新的列表 , 它是另一个列表 other 的副本 ;
	list(const list& other);// list 双向链表容器 使用初始化列表构造list<int> lstInt{1, 2, 3, 4, 5};// 是 lstInt 的副本list<int> lstInt2 (lstInt);
  • 参数为另一个 list 容器 指定区间范围的 迭代器 : 该 构造函数会创建一个新的列表 , 其元素是从范围 [first, last) 复制的 , 注意是 前闭后开区间 ; 这个范围可以是任何类型的输入迭代器 , 包括但不限于指针和 std::vector、std::deque 等容器的迭代器 ;
	list(InputIt first, InputIt last);// list 双向链表容器 使用初始化列表构造list<int> lstInt{1, 2, 3, 4, 5};// 注意是前闭后开区间list<int> lstInt3( ++lstInt.begin(), lstInt.end());

代码示例 :

#include "iostream"
using namespace std;
#include "list"// 打印 list 容器内容
void printL(list<int>& lst) {// 获取迭代器起始位置list<int>::iterator it = lst.begin();cout << "list 容器内容 : ";// 循环判定, 如果没有迭代到最后一个元素的后一个位置, 那么一直循环while (it != lst.end()){// 获取元素值cout << *it << " ";// 迭代器指向下一个元素it++;}// 回车换行cout << endl;
}int main() {// list 双向链表容器 使用初始化列表构造list<int> lstInt{1, 2, 3, 4, 5};// 是 lstInt 的副本list<int> lstInt2 (lstInt);// 注意是前闭后开区间list<int> lstInt3( ++lstInt.begin(), lstInt.end());// 打印 list 容器内容printL(lstInt);printL(lstInt2);printL(lstInt3);// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
};

执行结果 :

list 容器内容 : 1 2 3 4 5
list 容器内容 : 1 2 3 4 5
list 容器内容 : 2 3 4 5
请按任意键继续. . .

在这里插入图片描述

相关文章:

  • nginx-proxy-manager初次登录502 bad gateway
  • TensorFlow是什么
  • 单例模式你了解嘛?
  • Pytest框架 —— 用例标记和测试执行篇!
  • k8s搭建(一、环境配置与docker安装)
  • 【Python常见数据结构操作-持续更新】
  • 利用Jmeter做接口测试(功能测试)全流程分析!
  • Go在Win10上接收UDP组播数据
  • Y9000P + ubuntu22.04 配置Anaconda+pycharm +pytorch
  • python作业题百度网盘,python作业答案怎么查
  • 汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点
  • Go 泛型发展史与基本介绍
  • Spring系列:基于Spring-Jdbc实现事务
  • HBase基础知识(六):HBase 对接 Hive
  • 前后端访问报错
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Fastjson的基本使用方法大全
  • Javascript编码规范
  • Linux快速复制或删除大量小文件
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • 阿里云应用高可用服务公测发布
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端技术周刊 2019-02-11 Serverless
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • Nginx实现动静分离
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #include
  • #Spring-boot高级
  • $.ajax()方法详解
  • (02)Hive SQL编译成MapReduce任务的过程
  • (function(){})()的分步解析
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (论文阅读11/100)Fast R-CNN
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)http协议
  • (转)iOS字体
  • (转)setTimeout 和 setInterval 的区别
  • (转)大型网站架构演变和知识体系
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net环境下的缓存技术介绍
  • .vimrc 配置项