C++——STL标准模板库——容器详解——list

一、基本概念

(一)定义

list:双向链表。list是一种分布式存储的线性表,每个节点分为数据域和指针域,其中指针域中包含一个指向前驱节点的指针和一个指向后续节点的指针,基本模型如下:

(二)特性

1、双向链表:每个元素都有一个前驱和一个后继,这种结构允许在链表的任何位置实现快速的插入和删除而不影响其他元素。插入和删除时间复杂度为O(1)。

2、迭代器:list提供了双向迭代器,支持++和--运算符,能够前后移动,但不支持随机访问,也就是不支持+、-、+=、-=运算。

3、优势和劣势:相对于deque或者vector,在任意位置插入或者删除元素效率较高;但随机访问效率较低。使用场景多为需要频繁插入或者删除元素时。

二、构造函数

(1)list<T>::list();                        默认构造函数

(2)list<T>::list(size_t size);       构造包含size个元素的链表,默认值为0;

(3)list<T>::list(size_t size,T value);        申请size大小链表,初始化为value;

(4)list<T>::list(initializer_list<int> _list);   初始化列表构造;

(5)list<T>::list(list<int>& other);               拷贝构造函数; 

(6)list<T::list(iterator begin,iterator end); 指定范围构造;

(7)list<T>::list(list<int>&& other);             移动构造;(c++11)

三、成员函数

(一)迭代器相关函数

begin()和end();                返回指向首节点迭代器和指向尾节点后面一个位置迭代器;

cbegin()和cend();             begin()和end()的常量迭代器

rbegin()和rend();              begin()和end()的反向迭代器

crbegin()和crend();           begin()和end()的反向常量迭代器

(二)大小相关函数

size_t list<T>::size();                        返回链表当前元素数量

size_t list<T>::max_size();               返回链表最大容纳元素数量

bool   list<T>::empty();                       判断链表是否为空

(三)访问函数

const T& list<T>::front();                                返回第一个元素常量引用;

const T& list<T>::back();                               返回最后一个元素常量引用;

(四)修改函数

void list<T>::push_back(T&value);                尾插

void list<T>::push_front(T&value);                头插

void list<T>::pop_back();                               尾删

void list<T>::pop_front();                               头删

void list<T>::remove(T&value);                     删除指定元素

void list<T>::unique();                                   删除相邻且重复的后续元素

void list<T>::insert(iterator pos,T&value);     指定位置插入元素,存在插入多个元素、插入区间、插入初始化列表等多个重载

void list<T>::splice(iterator pos,list<T>&other); 指定位置复制插入或者移动插入other链表(指定元素或指定区间的元素)

void list<T>::erase(iterator pos);                   删除迭代器指定位置的元素,或者区间

(五)查找函数

list<T>::itrator find(list<T>::iterator first,list<T>::iterator last,const T& value);                                    查找容器指定区间内的value值第一次出现的位置

int count(list<T>::iterator first,list<T>::iterator last,const T&value);                                                 查找容器指定区间内value的个数

注意:find()函数和count()函数不是容器的成员函数

(六)其他函数

list<T>::swap(list<T>&other);     交换两个链表的内容

list<T>::revers();                         翻转链表

list<T>::sort();                             排序函数,默认递增;当链表内元素是自定义类型或者需要递减排序时,需要传入比较函数作为参数。

list<T>::clear();                           清空链表

list<T>::resize(size_t newsize);  改变链表大小,大于原链表大小时,添加初始化元素;小于原链表大小时,从链表后面删除相应元素。

四、排序算法示例

#include<iostream>
using namespace std;
#include<list>
#include<algorithm>
#include<string>
class Person {
public:string m_Nmae;int m_Age;int m_Height;
};
void printPerson(const Person&p) {cout << "姓名:" << p.m_Nmae << " 年龄:" << p.m_Age << " 身高:" << p.m_Height << endl;
}
bool MyCompare(Person&p1, Person&p2) {if (p1.m_Age == p2.m_Age) {return p1.m_Height > p2.m_Height;}else {return p1.m_Age < p2.m_Age;}
}
void test() {Person p1 = { "张三",20,170 };Person p2 = { "李四",30,165 };Person p3 = { "王五",40,185 };Person p4 = { "赵六",40,180 };Person p5 = { "陈七",50,185 };list<Person>l;l.push_back(p1);l.push_back(p3);l.push_back(p4);l.push_back(p2);l.push_front(p5);for_each(l.begin(), l.end(), printPerson); cout << endl;l.sort(MyCompare);for_each(l.begin(), l.end(), printPerson);
}
int main(int argc,char const **argv) {test();return 0;
}

 例子中对排序多加了一层逻辑,优先年龄排序,年龄相同时根据身高排序。

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

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

相关文章

ZooKeeper 实战(二) 命令行操作篇

文章目录 ZooKeeper 实战(二) 命令行操作篇1. 服务端命令1.1. 服务启动1.2. 查看服务1.3. 重启服务1.4. 停止服务 2. 客户端命令2.1. 启动客户端2.2. 查看节点信息查看根节点详情 ls -s /添加一个watch监视器 ls -w /列举出节点的级联节点 ls -R / 2.3. 查看节点状态2.4. 创建节…

谷粒商城-缓存使用分布式锁SpringCache(5天)

缓存使用 1.1.1 哪些数据适合放入缓存 即时性、 数据一致性要求不高的 访问量大且更新频率不高的数据&#xff08;读多&#xff0c; 写少&#xff09; 例如&#xff1a;电商类应用&#xff0c; 商品分类&#xff0c; 商品列表等适合缓存 本地缓存 使用Map进行本地缓存 本地缓存…

Windows安全基础:UAC

目录 UAC原理介绍 UAC的四个安全级别定义 UAC的触发条件 UAC用户登录过程 UAC虚拟化 配置UAC UAC原理介绍 用户账号控制&#xff08;User Account Control&#xff09; 为Windows Vista推出的一项安全技术&#xff0c;其原理是通过限制安全应用软件对系统层级的访问&…

北重T型槽平台厂家介绍铸铁平台在业界有怎样的优势

河北北重厂家简单介绍一下铸铁平台在业界具有哪些优势&#xff1a; 高强度&#xff1a;铸铁平台具有较高的强度和刚性&#xff0c;能够承受较大的重量和荷载。 耐磨性&#xff1a;铸铁平台表面通常经过处理&#xff0c;具有良好的耐磨性&#xff0c;能够在长期使用中保持平整和…

产品设计标书制作全攻略:从入门到精通

在商业竞争日益激烈的今天&#xff0c;一份出色的产品设计标书往往是企业赢得项目、展现实力的重要法宝。那么&#xff0c;如何制作一份既专业又具吸引力的产品设计标书呢&#xff1f; 一、明确目标与需求 在制作产品设计标书之前&#xff0c;首先要明确项目的目标和需求。这…

Linux 安装 Mysql5.7(glibc版)

前言:经过一天半的折腾,终于把 mysql 5.7.17 版本安装上了 centos 7 系统上,把能参考的博客几乎都看了一遍,终于发现这些细节问题,然而翻了无数的文章,基本上都没有提到这些,所以 尽量把这些细节写下来,一方面是供初学者们参考,另一方面也是对摸索做一个总结 。 一、…

SpringBoot3自动配置原理

​​​​​​自动配置 遵循约定大约配置的原则&#xff0c;在boot程序启动后&#xff0c;起步依赖中的一些bean对象会自动注入到ioc容器 看一下我们前面写的代码有没有达到自动配置的效果呢&#xff1f; 没有自动&#xff0c;我们写了配置类&#xff0c;写了Import注解&#…

Spring Boot自定义启动Banner在线生成工具

记录一下&#xff0c;后续有更新添加 链接: Spring Boot自定义启动Banner在线生成工具

【Linux】磁盘分区管理及挂载/永久挂载管理

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

S1-05二进制信号量和计数器信号量

二进制信号量 二进制信号量&#xff0c;又叫二值信号量&#xff0c;要么是0&#xff0c;要么是1&#xff0c;也是通过Take和Give方式获取和释放&#xff0c;用于控制对共享资源的访问。在每次访问共享资源之前需要获取二进制信号量&#xff0c;若已被获取则任务会被阻塞直到二…

提供一些防扫描被封禁、防溯源工具

1► 介绍 SecScanC2可以创建P2P网络进行安全扫描和C2。该工具可以帮助安全研究人员更有效地进行渗透测试&#xff0c;防止扫描被封禁&#xff0c;保护自己免受溯源。 2► 工具特性 P2P&#xff1a;将大量互联网节点构建成P2P网络 防止扫描被封禁&#xff1a;随机或指定节点…

二阶贝塞尔曲线生成弧线

概述 本文分享一个二阶贝塞尔曲线曲线生成弧线的算法。 效果 实现 1. 封装方法 class ArcLine {constructor(from, to, num 100) {this.from from;this.to to;this.num num;return this.getPointList();}getPointList() {const { from, to } thisconst ctrlPoint thi…

二级C语言备考4

一、单选 共40题 &#xff08;共计40分&#xff09; 第1题 &#xff08;1.0分&#xff09; 题号:6198 难度:易 第1章 以下说法正确的是 (). A:C语言被称为"高级语言"是因为它用接近人们习惯的自然语言和数学语言作为表达形式,使人们学习和操…

rime中州韵小狼毫 汉语拼音输入方案

在word中&#xff0c;我们可以轻易的给汉字加上拼音&#xff0c;如下&#x1f447;&#xff1a; 但是&#xff0c;如何单独的输入拼音呢&#xff1f;例如输入 pīn yīn, 再如 zhōng guō。今天我们分享一个使用rime中州韵小狼毫须鼠管输入法配置的输入汉语拼音的输入方案。功…

C++面试问题---Const

1.const 1.1 作用 修饰变量&#xff0c;说明该变量不可以被改变&#xff1b;修饰指针&#xff0c;分为指向常量的指针&#xff08;pointer to const&#xff09;和自身是常量的指针&#xff08;常量指针&#xff0c;const pointer&#xff09;&#xff1b;修饰引用&#xff0c;…

JFrog_Artifactory CLI 的使用

文章目录 1. 文件上传&#xff0c;下载&#xff0c;删除&#xff0c;拷贝, 移动&#xff0c;搜索2. 用户登录信息配置3. 文件属性设置4. 执行curl命令 1. 文件上传&#xff0c;下载&#xff0c;删除&#xff0c;拷贝, 移动&#xff0c;搜索 #1.上传tar包&#xff0c;并且创建包…

【uniapp-小程序-分享图5/4】

utils.js //裁剪分享的图片为5:4 const makeCanvas (imgUrl) > {console.log("imgUrl",imgUrl);return new Promise((resolve, reject) > {// 获取图片信息,小程序下获取网络图片信息需先配置download域名白名单才能生效uni.getImageInfo({src: imgUrl,succe…

tkinter电子时钟实现时间日期可实现透明无标题栏

您可以使用Python的Tkinter库来创建一个简单的电子时钟应用程序。以下是一个示例代码&#xff0c;它可以在窗口上显示当前的时间和日期&#xff0c;并且窗口是透明的且没有标题栏。 from tkinter import * import time# 创建主窗口 root Tk()# 设置窗口透明 root.attributes(…

【机器学习300问】6、什么是机器学习中的特征量?

一、首先我们看三个例子 例一&#xff1a;在辨别水果的任务中&#xff0c;人类一般会通过外观、味道、颜色等方面信息来进行区分。而机器学习则通过水果的颜色、重量、气味成分的量等被称之为“特征量”的数值来区分。 例二&#xff1a;在手写数字识别任务中&#xff0c;人类…

概率大揭秘:深度复习概率论,事半功倍的学霸秘籍!

第一章 概率论的基本概念 一、事件及其关系与运算 1、样本空间、样本点、随机事件、必然事件、不可 能事件、基本事件和复合事件的概念&#xff1b; 2、事件的包含与相等&#xff1a;若事件A包含事件B&#xff0c;则B的发生必然导致A的发生。进而有P(AB)P(B)&#xff0c;P…