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.hqwc.cn/news/343514.html

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

相关文章

Python学习从0到1 day2 python注释

那就祝我们 all is well ——24.1.12 一、python中的注释 1.注释的作用 注释代码与非注释代码对比&#xff0c;可以发现&#xff0c;添加了注释的代码更加易于程序的阅读 2.注释的分类及方法 注释在python中有两种形式&#xff1a;单行注释和多行注释。 单行注释只能注释一行…

日常工作中,软件测试人员如何避免“背锅”

作为一名软件测试工程师&#xff0c;日常工作中最常打交道的肯定就是开发和产品经理。有沟通就会问题&#xff0c;有问题难免会有争执。那么你肯定听过这些话&#xff1a; “这么弱智的bug你都测不出来吗&#xff1f;” “为啥这个功能还没测完就上线了&#xff1f;” “研发…

c++类程序设计题1

#include<iostream> #include<string> using namespace std;class cube{public ://设置长void setM(int m){M_l m;}int getl(){return M_l;}//设置宽void setr(int r){M_r r;}int get(){return M_r;}//设置高void setm(int m){M_m m;}int getm(){return M_m;}//…

Pycharm close project 速度缓慢解决办法

解决Pycharm close project缓慢现象 1.问题描述 close project后需要等待很长的时间。 2.解决办法 在Help -> Find Action -> 输入 Registry -> 禁用ide.await.scope.completion 问题解决&#xff01;&#xff01;&#xff01; &#x1f603;&#x1f603;&#x…

spring Security源码讲解-Sevlet过滤器调用springSecurty过滤器的流程

承接上文 上一节 http://t.csdnimg.cn/ueSAl 最后讲到了过滤器收集完成注入容器&#xff0c;这节我们来讲Security的Filter是怎么被Spring调用的。 我们先看webSecurity的performBuild方法(), 也就是说&#xff0c;最终返回的过滤器对象实例有两种情况当我们配置debugEnabl…

便捷特惠的快递寄件快递物流折扣平台 ,通常都有什么常见问题?

首先&#xff0c;最重要的一点是怎么寄快递更便宜&#xff1f; 我们在寄快递时&#xff0c;尽量把包裹压缩空间大一点&#xff0c;这样在体积上面就会减少一部分的费用呢&#xff0c;另外就是选择有优惠的平台下单。例如在闪侠惠递平台下单&#xff0c;单单打折&#xff0c;单…

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口&#xff1a; JobMaster.onStart();部署 Task 链条&#xff1a;JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …

数据库系统概念 第七版 中文答案 第3章 SQL介绍

3.1 将以下查询使用SQL语言编写&#xff0c;使用大学数据库模式。 &#xff08;我们建议您实际在数据库上运行这些查询&#xff0c;使用我们在书籍网站db-book.com上提供的示例数据。有关设置数据库和加载示例数据的说明&#xff0c;请参阅上述网站。&#xff09; a. 查找计算机…

fiddler筛选请求并修改参数

一、筛选请求 使用过滤&#xff0c;需勾选User Filter才会生效&#xff0c;运行当前的过滤规则&#xff0c;需点击Run Filterset now Hosts&#xff1a;主机过滤之局域网过滤 No Zone Filter&#xff1a;默认选项&#xff0c;不设置区域过滤器show only Intranet Hosts&…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题&#xff0c;但是确实也会让刚上手Linux小伙伴头疼一阵&#xff0c;故特有此文&#xff0c;希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令&#xff0c;经常下述命令来安装 yum install [-y] 包名 #-y的…

安全强化学习笔记

这里写自定义目录标题 参考资料环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学习路线图&#xff08;Safe RL…

如何使用人工智能优化 DevOps?

DevOps 和人工智能密不可分&#xff0c;影响着各种业务。DevOps 可以加快产品开发速度并简化现有部署的维护&#xff0c;而 AI 则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是&#xff0c;人工智能和机器学…