C++容器:list(双向链表)

一丶list介绍

C++中的list容器底层确实是以双向链表的形式实现的

  list容器是C++标准模板库(STL)中的一部分,它提供了对列表数据结构的实现。

  • 双向链表结构list容器的每个元素都是通过指针链接在一起的,每个元素都包含指向前一个和后一个元素的指针。这种双向链表的结构使得在list容器中插入和删除元素时无需移动其他元素,因此这些操作的时间复杂度为O(1)。
  • 内存分配:由于list容器基于双向链表,其元素可以分散存储在内存中,不需要像数组或vector那样连续分配内存空间。这使得list在内存使用上更加灵活,特别适合于需要频繁插入和删除操作的场景。
  • 迭代器稳定性list容器的迭代器在插入和删除操作中保持稳定性,即使在进行这些操作时,指向其他元素的迭代器也不会失效。

二丶list的使用

       C++中list容器提供了多种用于操作列表的函数,使得对元素的插入、删除和访问变得灵活而高效。以下是一些常用的list容器函数:

  • push_back():在列表的尾部插入一个新元素。
  • push_front():在列表的头部插入一个新元素。
  • pop_back():删除列表尾部的元素。
  • pop_front():删除列表头部的元素。
  • size():返回列表中元素的个数。
  • empty():判断列表是否为空,如果为空则返回true,否则返回false。
  • clear():清除列表中的所有元素。
  • erase():删除列表中的一个或多个元素。
  • remove():移除列表中所有等于特定值的元素。
  • sort():对列表中的元素进行排序。
  • reverse():反转列表中元素的顺序。
#include<iostream>
#include<list>
using namespace std;
template<class T>
void PrintList(const list<T>& l)  //打印函数
{
	auto it = l.begin();
	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void ListTest()
{
	list<int> l;    //空
	l.push_back(1);   //尾插
	l.push_back(2);
	l.push_back(3);
	PrintList(l);


	list<int> _l(l);  //构造函数重载
	PrintList(_l);
	_l.clear();


	l.push_front(4);  //头插
	l.push_front(5);
	l.push_front(6);
	PrintList(l);


	l.sort();   //排序
	PrintList(l);


	l.pop_back();  //尾删
	l.pop_back();
	PrintList(l);


	l.pop_front();  //头删
	l.pop_front();
	PrintList(l);
}
int main()
{
	ListTest();
	return 0;
}

 

        这些用法其实很简单,主要还是要学会灵活使用。这里要注意一下sort函数,默认是升序函数

底层使用的一般是快速排序算法,然后sort重载了另一个函数,这里的Compare 是用来控制升序或者降序的,称为仿函数

std::list::sort

(1)	
  void sort();

(2)	
template <class Compare>
  void sort (Compare comp);

      如下,MyCompare 只重载了运算符(),然后我们自己写了一个sort,调用的是std::sort,std::sort(迭代器1,迭代器2,仿函数),不传仿函数就调用另一个重载函数将迭代器范围内升序排序

struct MyCompare {
    bool operator()(int a, int b) {
        return a > b; // 降序排列
    }
};

template <class ForwardIt, class Compare>
void sort(ForwardIt first, ForwardIt last, Compare comp) {
    // ... 其他代码 ...

    while (first != last) {
        // ... 其他代码 ...

        // 使用comp比较函数对象比较两个元素
        if (comp(*i, *j)) {
            // ... 其他代码 ...
        } else {
            // ... 其他代码 ...
        }

        // ... 其他代码 ...
    }

    // ... 其他代码 ...
}

三丶与vector比较

  1. 内存分配:

    • vector:在内存中连续存储元素,当需要添加或删除元素时,可能会导致整个容器的内存重新分配。
    • list:在内存中非连续存储元素,每个元素都是一个单独的节点,包含数据和指向前后节点的指针。因此,添加或删除元素时,只需要修改相邻节点的指针,不会影响其他元素的内存位置。
  2. 访问方式:

    • vector:支持随机访问,可以直接通过索引访问任何元素,访问速度快。
    • list:不支持随机访问,只能通过迭代器进行顺序访问。
  3. 插入和删除操作:

    • vector:在尾部插入和删除元素的效率高,因为不需要移动其他元素;而在中间或头部插入和删除元素效率较低,因为需要移动其他元素。
    • list:在任何位置插入和删除元素的效率都较高,因为只需要修改相邻节点的指针。
  4. 容量和大小:

    • vector:有固定的容量,可以容纳的元素数量有限。当超过容量时,会自动扩容,可能会引起内存重新分配和元素移动。
    • list:没有固定容量的概念,只要内存允许,可以不断地添加新元素。
  5. 性能:

    • vector:在内存中连续存储,有利于缓存的利用,因此访问速度较快。但在插入和删除操作时可能需要移动大量元素,效率较低。
    • list:在内存中非连续存储,不利于缓存的利用,访问速度较慢。但在插入和删除操作时只需要修改指针,效率较高。

    总之,vectorlist各有优缺点,具体使用哪个容器取决于具体的应用场景和需求。如果需要频繁访问元素,可以选择vector;如果需要频繁插入和删除元素,可以选择list

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英语学习笔记14——What color‘s your ... ?

What color’s your … ? 你的 …… 是什么颜色的&#xff1f; 词汇 Vocabulary case n. 箱子【封闭的】 相关&#xff1a;box n. 箱子【开口的】    bookcase n. 书架 补充&#xff1a;case n. 案件&#xff0c;案例 口语&#xff1a;It’s a small case.    小意思&…

电脑常用的PDF阅读器-嗨动PDF编辑器!带你详细了解它

电脑常用的PDF阅读器-嗨动PDF编辑器&#xff01;在数字化信息爆炸的时代&#xff0c;PDF格式的文件因其易于打印和保留原始格式等优点&#xff0c;成为了人们日常工作和学习的常用格式。而对于PDF文件的处理&#xff0c;一款功能强大、操作简便的PDF阅读器是必不可少的。今天&a…

APP封装后防止破解的全方位策略

移动应用开发完成后&#xff0c;封装&#xff08;编译打包&#xff09;是发布前的重要步骤。然而&#xff0c;一旦APP发布&#xff0c;就可能面临被逆向工程破解的风险&#xff0c;从而导致源代码泄露、数据被盗取等严重后果。 本文将介绍一系列实用的策略和技术&#xff0c;帮…

GM812条码模块的技术参数

扫码性能参数 *测试条件&#xff1a;环境温度23℃&#xff1b;环境照度300 LUX&#xff1b; **测试条件&#xff1a;测试距离&#xff08;最小景深最大景深&#xff09;/2&#xff1b; 环境温度23℃&#xff1b;环境照度300 LUX&#xff1b; *规格如有更改&#xff0c;恕不另…

处理Mini-ImageNet数据集,用于分类任务

一、Mini-ImageNet数据集介绍 ImageNet 1000类的数据太大了&#xff0c;全部下载大概有100GB左右。 2016年google DeepMind团队从ImagNet数据集中抽取的一小部分&#xff08;大小约3GB&#xff09;制作了Mini-ImageNet数据集&#xff0c;共有100个类别&#xff0c;每个类别有…

vscode对一些软件的调试插件。

vscode对一些软件的调试插件。 1、ae &#xff0c;f1然后选择运行 after effect 脚本 2、maya,右键send code to maya 3、max&#xff0c;ctrle运行脚本到max 4、unity 从在Visual Studio代码使用.NET的核心&#xff1a; 1、安装.NET Core SDK&#xff0c;链接: https://dotn…

Unity 模拟放大镜局部放大UI 效果实现

UI 放大实现 RectTransformUtility.ScreenPointToLocalPointInRectangle(rectScale, eventData.position, eventData.pressEventCamera, out localPos); 使用IPointerDownHandler 获取鼠标点击时的有效负载&#xff0c;并将鼠标坐标转成对应的UI 坐标&#xff0c;rectScale 为…

(1)双指针算法介绍与练习:移动零

目录 双指针算法介绍 练习&#xff1a;移动零 双指针算法介绍 双指针算法常见于数组和双向链表的题型 在数组中&#xff0c;双指针中的指针代表数组元素的下标&#xff0c;而不是真正的指针类型变量 在双向链表中&#xff0c;双指针中的指针即为真正意义上的指针&#xff…

前馈神经网络FNN、多层感知机MLP和反向传播推导

目录 一、前馈神经网络FNN 激活函数的使用 二、多层感知机MLP MLP的典型结构 多层感知机MLP的特点 和前馈神经网络FNN的区别 三、传播推导 1、前向传播(Forward propagation) &#xff08;1&#xff09;输入层到隐藏层 &#xff08;2&#xff09;隐藏层到输出层 2、…

webpack生成模块关系依赖图示例:查看构建产物的组成部分 依赖关系图

npm i -D webpack-bundle-analyzer core-js babel-loaderwebpack.config.js const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin; module.exports {entry: ./src/index.js,output: {filename: main.js,},// mode: production, // 或者 produ…

【数据结构】堆(超详细)

文章目录 前言堆的概念及结构堆的实现堆的向下调整算法&#xff08;建小堆为例&#xff09;堆的向上调整算法&#xff08;建小堆为例&#xff09;堆的初始化销毁堆堆的插入堆的删除(规定删堆顶的数据)取堆顶元素判断堆是否为空获取堆的个数 完整代码&#xff08;包括测试代码&a…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置&#xff08;所有机器&#xff09; 1&#xff0c;关闭防火墙 2&#xff0c;关闭selinux 3&#xff0c;关闭swap 4, 根据规划设置主机名 5, 做域名映射 6&#xff0c;调整内核参数 7&#xff0c; 时间同步 三 部署 dock…

微软exchange邮箱发送

使用java发送exchange类型的邮件&#xff0c;foxmail中配置如下图&#xff1a; 需要的maven依赖如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

1. 杜克大学官方宣布2027届新生画像什么是vue关键特点核心概念简单示例生态系统

目录 1. 杜克大学官方宣布2027届新生画像 什么是vue 关键特点 核心概念 简单示例 生态系统 1. 杜克大学官方宣布2027届新生画像 杜克大学校报《The Chronicle》已连续第七年对杜克大学的一年级新生进行深入调查&#xff0c;探讨该群体家庭受教育背景、家庭收入水平以及…

异步I/O库-libuv介绍

1.简介 libuv是一个跨平台的支持事件驱动的异步I/O的库&#xff0c;使开发者可以以非阻塞的方式执行文件I/O操作、网络通信、子进程管理等。 libuv的主要特点包括&#xff1a; 事件循环&#xff1a;libuv有一个基于事件循环的模型&#xff0c;它不断地轮询事件&#xff0c;并…

洗地机怎么挑?洗地机选购指南,2024洗地机测评选购攻略

在快节奏的生活中&#xff0c;繁琐的清洁工作往往令人头疼&#xff0c;随着洗地机的诞生&#xff0c;极大地简化了清洁的过程&#xff0c;洗地机凭借着它吸拖洗为一体的高效清洁特点&#xff0c;受到家庭和商业场所的广泛欢迎。那么&#xff0c;洗地机怎么挑&#xff0c;要注意…

速度背!24上软考网工“经典100道母题来了”!

距离软考考试的时间越来越近了&#xff0c;趁着这两周赶紧准备起来。 今天给大家整理了——网络工程师经典100道母题&#xff08;含解析&#xff09;&#xff0c;有PDF版&#xff0c;可打印&#xff0c;每天刷一点&#xff0c;考试就像遇到“老朋友”。 第一章节&#xff1a;计…

重磅!OpenAI发布GPT-4o,非常惊艳语音版ChatGPT!

5月15日凌晨&#xff0c;谷歌召开“ I/O 2024”&#xff0c;生成式AI成为本次大会的重点并发布了一系列产品和多款大模型。 其中&#xff0c;谷歌DeepMind发布了一款全新的AI 代理&#xff08;Agent&#xff09;产品Project Astra&#xff0c;可以像昨天OpenAI发布的GPT4o一样…

springsecurity项目快速搭建

自定义security的搭建 package com.sangeng.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Co…

YOLOv8改进教程|加入可改变核卷积AKConv模块,效果远超DSConv!

⭐⭐ YOLOv8改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ​ ⭐⭐ 一、 论文介绍 论文链接&#xff1a;https://arxiv.org/abs/2311.11587 代码链接&#xff1a;GitHub - CV-ZhangXin/AKConv 论文速览&#xff1a;&#xff1a;AKConv是2023年11月发表的一种可变卷积…