c++ STL系列——(三)list

2024-02-12 22:20
文章标签 c++ stl list 系列

本文主要是介绍c++ STL系列——(三)list,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C++ STL中,list是一个双向链表容器,可以用于存储任意类型的元素。list提供了一系列的操作函数,包括元素的插入、删除、排序、查找以及对容器的遍历等。本文将详细介绍list的特点、用法以及其与其他容器的比较。

list的特点

list是一个双向链表,其内部每个节点都包含了元素的值、指向前驱节点的指针和指向后继节点的指针。这种结构使得list具有许多独特的特点:

  • 动态调整容量:由于list是一个链式结构,因此其大小并不会像数组容器那样受到最大容量的限制,可以随时添加或移除元素。
  • 快速的元素插入和删除:由于list是一个双向链表,因此在任何位置进行元素的插入和删除操作的时间复杂度都是O(1)。
  • 不支持随机访问:由于list是一个链表,因此无法通过下标或指针进行随机访问,只能通过迭代器进行遍历。

list的用法

创建和初始化

创建一个空的list可以使用默认构造函数,也可以使用初始化列表:

std::list<int> mylist; // 创建一个空的int类型的list
std::list<std::string> mystrings = {"hello", "world"}; // 使用初始化列表创建list

插入和删除元素

list提供了多种方法来插入和删除元素,例如push_back()push_front()insert()erase()等。下面是一些示例:

std::list<int> mylist = {1, 2, 3, 4, 5};// 在末尾添加元素
mylist.push_back(6);// 在开头添加元素
mylist.push_front(0);// 在指定位置插入元素
auto it = mylist.begin();
++it;
mylist.insert(it, 9);// 删除末尾元素
mylist.pop_back();// 删除开头元素
mylist.pop_front();// 删除指定位置的元素
auto it2 = mylist.begin();
++it2;
mylist.erase(it2);

访问和修改元素

由于list不支持随机访问,因此必须使用迭代器进行遍历和访问元素。要修改元素的值,可以使用迭代器的解引用操作符:

std::list<int> mylist = {1, 2, 3, 4, 5};// 遍历list并输出元素
for (auto it = mylist.begin(); it != mylist.end(); ++it) {std::cout << *it << " ";
}// 修改指定位置的元素
auto it = mylist.begin();
++it;
*it = 9;

排序和查找

list提供了内置函数来排序和查找元素,例如sort()find()count()等:

std::list<int> mylist = {5, 3, 2, 4, 1};// 对元素进行排序
mylist.sort();// 查找元素并返回迭代器
auto it = std::find(mylist.begin(), mylist.end(), 3);// 统计元素出现的次数
int count = std::count(mylist.begin(), mylist.end(), 5);

list与其他容器的比较

在C++ STL中,除了list之外还有许多其他容器,例如数组容器vector、关联容器mapset等。虽然list具有自己独特的特点,但在一些方面,它也存在一些劣势:

  • 不支持随机访问:由于list是一个链表,因此无法通过下标或指针进行随机访问,这可能会导致一些性能问题。
  • 占用更多的内存:由于每个节点都需要存储元素值以及指向前驱节点和后继节点的指针,因此list通常会占用比其他容器更多的内存空间。
  • 缓存不友好:由于list的元素在内存中不是连续存储的,因此在遍历时可能会出现缓存未命中的情况,从而影响性能。

然而,list在动态调整容量、快速元素插入和删除等方面具有明显优势,这使得它在某些场景下仍然是一个非常有用的容器。

结论

总之,list是C++ STL中一个非常重要和有用的容器,可以用于存储任意类型的元素,并提供了多种操作函数,如插入、删除、排序、查找和遍历等。虽然list在一些方面具有劣势,但在一些场景下它仍然是一个非常有用的容器。如果你需要一种动态调整容量、快速插入和删除元素的容器,那么list可能是一个不错的选择。

 

这篇关于c++ STL系列——(三)list的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703754

相关文章

Python 全栈系列101 - 使用百度api识别营业执照

说明 百度有提供营业执照的ocr,打算先试一下看看效果。从某些角度,还是感谢百度提供的免费资源的: 1 当没什么时间自己做时,毕竟有一个还可以用的2 如果打算自己做,也有个参考和对比 内容 1 首先要获得调用权限 我很早的时候就有百度的账号,那时候设置好了,现在不太记得,有需要的同学自己试试。 2 OCR的功能 给了一些免费的配额,对我这种测试的需求来说也够了 如果要购买的话,

58、Visual studio 2019/2022+C#传递Mat数据给C++动态包处理,并将处理结果Mat返回给C#显示、保存

基本思想:使用c#调用c++的动态包,进行图像帧传入和处理,然后返回结果;这样就可以独立的写c++算法,使用c#进行前端界面和布局开发了  注意:vs2022的安装CSharp只能从命令行安装 一、创建C#工程  然后简单测试一下工程  二、在C#中先把OpenCV调用起来 (1)在C#中打开搜索NuGet(库程序包管理器)

C++ //练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。

C++ Primer(第5版) 练习 10.17 练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。 环境:Linux Ubuntu(云服务器) 工具:vim   代码块 /*************************************************************

c++八股文:c++面向对象

文章目录 1.c++面向对象三大特性2.c++的三个访问修饰符3.多重继承4.重载与重写5.c++多态怎么实现6.成员函数/成员变量/静态成员函数/静态成员变量的区别7.构造函数和析构函数8.c++构造函数有几种9.什么是虚函数什么是虚函数表10.虚函数和纯虚函数的区别11.抽象类和纯虚函数12.虚析构13.为什么要虚析构,为什么不能虚构造14.那些函数不能被声明为虚函数15.浅拷贝和深拷贝

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏:C++干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1.2数组参数的作用 2.1.3一维数组的传参 2.1.4二维数

C++学习第五天(内存管理)

1、内存分布 int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* p

2403C++,C++20协程通道

原文 通道是一个可用来连接协程,实现不同协程间通信的并发安全队列. @Testfun `test know channel`() = runBlocking<Unit> {val channel = Channel<Int>()//生产者val producer = GlobalScope.launch {var i = 0while (true) {delay(1000)channel.se

从C向C++10——文件操作

一.文件基础 1.文件类 C++ 标准库中专门提供了 3 个类用于实现文件操作,它们统称为文件流类,这 3 个类分别为: ifstream:专用于从文件中读取数据;ofstream:专用于向文件中写入数据;fstream:既可用于从文件中读取数据,又可用于向文件中写入数据。 值得一提的是,这 3 个文件流类都位于<fstream>头文件中,因此在使用它们之前,程序中应先引入此头文件。

走进SQL审计视图——《OceanBase诊断系列》之二

1. 前言 在SQL性能诊断上,OceanBase有一个非常实用的功能 —— SQL审计视图(gv$sql_audit)。在OceanBase 4.0.0及更高版本中,该功能是 gv$ob_sql_audit。它可以使开发和运维人员更方便地排查在OceanBase上运行过的任意一条SQL,无论这些SQL是成功与否,都有详细的运行信息记录。这些信息包括客户端和服务端的IP端口、SQL语句、执行时

C++实现人脸检测、分割、并计算人脸各个部分的颜色

人脸分割提取颜色是一个计算机视觉领域的技术问题,其目标是从人脸图像中提取人脸的各个部分,并得到各个部分的颜色分布。该技术在人脸识别、美颜、虚拟化妆等领域有着广泛的应用。 人脸分割提取颜色的基本步骤如下: 人脸检测:首先需要检测出人脸的位置和大小。常用的方法包括: 基于 Haar 特征的人脸检测基于深度学习的人脸检测 人脸分割:在检测出人脸之后,需要将人脸分割成不同的部分,例如: