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的个数

lower_bound(value);        返回指向第一个小于给定value的元素的迭代器

upper_bound(vlaue);       返回指向第一个大于给定value的元素的迭代器

equal_range(value);        返回有序序列中第一个value值和最后一个value值出现位置的区间,返回值为pair类型,叫做对组。原型为pair<typename T,typename K>,代表包含两个数据类型的数据结构。first代表第一个类型,second代表第二个类型。

注意:这些函数不是容器的成员函数

(六)其他函数

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;
}

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

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

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

相关文章

PHP+MySQL组合开发:微信小程序万能建站源码系统 附带完整的搭建教程

随着移动互联网的快速发展&#xff0c;微信小程序已成为企业进行移动营销的重要工具。然而&#xff0c;对于许多中小企业和个人开发者来说&#xff0c;开发一个功能完善、用户体验良好的小程序是一项复杂的任务。罗峰给大家分享一款微信小程序万能建站源码系统。该系统采用PHPM…

AI工具推荐:开源TTS(文本生成语音)模型集合

XTTS TTS是一个语音生成模型&#xff0c;可以通过一个简短的6秒音频片段将声音克隆到不同的语言。它不需要大量的训练数据&#xff0c;也不需要耗费大量时间。TTS支持17种语言&#xff0c;可以进行声音克隆、情感和风格转移、跨语言声音克隆以及多语言语音生成等功能。XTTS-v2…

Oracle-java下载、开源/商业许可证(收费、免费说明)、版本发布日志

Oracle-java下载、开源/商业许可证&#xff08;收费、免费说明&#xff09;、版本发布日志 下载开源/商业许可证&#xff08;收费、免费说明&#xff09;java8版本发布日志以上是一般情况&#xff0c;具体的以官网发布信息为准 下载 下载地址&#xff1a;https://www.oracle.c…

经纬恒润首个国产化4G T-BOX已获客户定点

近日&#xff0c;经纬恒润首个国产化4G T-BOX产品获得某头部整车厂定点&#xff0c;预计2024年开始量产。 经纬恒润自主研发的首个国产化4G T-BOX, 基于4G蜂窝通讯、GNSS卫星定位和车辆总线通信等核心技术&#xff0c;可以为整车客户提供包括行车数据采集、高精度位置信息、车…

openpose环境搭建

编程如画&#xff0c;我是panda&#xff01; 最近学习要用要openpose&#xff0c;配了三天的环境&#xff0c;快疯了&#xff0c;踩了很多坑&#xff0c;在这里和大家分享一下 目录 前言 一、安装openpose 二、运行openpose 三、常见的两个错误 1. No module named pyopen…

RANSAC(Random sample consensus)随机抽样一致性

文章目录 算法介绍实现过程以直线拟合为例直线的描述源码参考连接 算法介绍 RANSAC&#xff08;Random Sample Consensus&#xff09;是一种迭代的参数估计算法&#xff0c;用于从包含噪声和异常值的数据中拟合数学模型。它最初由Fischler和Bolles于1981年提出&#xff0c;被广…

soso移动营业大厅(纯后端+MySQL数据库+JDBC)

一、项目需求 中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各…

[HNCTF 2022 Week1]What is Web

flag 在源码里 <! 是 HTML 文档的注释格式&#xff0c;在源码里按 Ctrl F 搜索 <! 能帮你更快地找到提示。 将这个字符串 base64 解码得到 flag &#xff1a;

React Native 环境安装

Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 搭建开发环境 React Native 中文网 Homebrew&#xff08;包管理器&#xff09; → rvm&#xff08;ruby版本管理&#xff09; → ruby → cocoapods 安装 Homebrew Homebrew /bin/ba…

shell 循环 判断

for 循环 Shell 脚本里最简单的循环当属 for 循环。最简单的 for 循环如下所示&#xff0c;你只需将变量值依次写在 in 后面即可&#xff1a; #!/bin/bashfor num in 1 2 3 4 doecho $num done 如果要循环的内容是字母表里的连续字母或连续数字&#xff0c;那么就可以按以下语…

Matlab 使用 DH table 建立的 robot 和实际不符

机器人仿真 想借助 matlab robotics toolbox 来仿真机器人&#xff0c;但是直接输入自己的 DH table 显示出来的 robot 和实际不情况不符。 DH table 建立 robot Build Manipulator Robot Using Kinematic DH Parameters 主要使用 setFixedTransform&#xff0c;DH table 中…

智云谷再获资本市场青睐,完成数千万元A+轮融资

近日&#xff0c;深圳前海智云谷科技有限公司&#xff08;以下简称“智云谷”&#xff09;完成数千万元A轮融资&#xff0c;本轮融资由青松基金独家投资&#xff0c;多维资本担任独家融资财务顾问。本轮融资资金将用于扩大新技术研发投入、智能工厂扩产、加速产品交付&#xff…

K8S----YAML

kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象使用哪个API版本&#xff0c…

Vue-20、Vue监测数组改变

1、数组调用以下方法Vue可以监测到。 arr.push(); 向数组的末尾追加元素 const array [1,2,3] const result array.push(4) // array [1,2,3,4] // result 4arr.pop(); 删除末尾的元素 const array [a, b] array.pop() // b array.pop() // a array.pop() // undefi…

【Shell编程练习】编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量&#xff0c;小于给定值时报警 猜大小 输入三个数并进行升序排序 系列文章目录编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态 编写脚本测试 192.…

opencv_角点检测

文章内容 一个opencv检测角点的程序 运行效果 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;void detectCorners(M…

AI数字人短视频变现项目:打造短视频运营变现新模式

如今&#xff0c;随着科技的快速发展和人们对数字内容的增长需求&#xff0c;短视频成为了互联网用户最喜爱的娱乐方式之一。然而&#xff0c;在这个竞争激烈的市场中&#xff0c;如何为短视频创作者提供更多的变现机会成为了一个重要的问题。AI数字人短视频变现项目的出现&…

【RT-DETR改进涨点】MPDIoU、InnerMPDIoU损失函数中的No.1(包含二次创新)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

深入解析多目标优化技术:理论、实践与优化

本文深入探讨了多目标优化技术及其在机器学习和深度学习中的应用&#xff0c;特别聚焦于遗传算法的原理和实践应用。我们从多目标优化的基础概念、常见算法、以及面临的挑战入手&#xff0c;进而详细介绍遗传算法的工作原理、Python代码实现&#xff0c;以及如何应用于实际的机…

【React源码 - Diff算法】

介绍 在React学习中&#xff0c;Diff算法(协调算法)&#xff0c;想必我们并不陌生&#xff0c;简单来说就是一个对比新老节点寻找差异&#xff0c;然后找出最小的一个变化集&#xff0c;最后对这个最小变化集进行最小的DOM操作&#xff0c;本文将从源码来分析在React(17.0.2)中…