STL——list

将数据进行链式存储

list 是一种物理存储单元上非连续存储结构 ,数据元素的逻辑顺序是通过链表中的指针链接实现的

是一种双向链表的容器,用于存储和管理元素的集合,

链表的组成:链表由一系列的结点组成

因为内存空间不是随机的,故list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

  • 采用动态内存分配,不会造成内存浪费和溢出

  • 执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

    • 这个特点同时也导致了进行插入和删除操作不会导致list迭代器的失效(节点之间的链接关系并不依赖于内存块的连续性,因此在std::list中进行插入或删除不会导致迭代器的失效,可以继续用它们来遍历和访问列表中的元素。

缺点:

  • 链表灵活,但是空间和时间额外耗费比较大

  • 不支持随机访问(元素不是随机存储)

构造函数

  • list<T> lst; //list采用采用模板类实现,对象的默认构造形式:

  • list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。

  • list(n,elem); //构造函数将n个elem拷贝给本身。

  • list(const list &lst); //拷贝构造函数。

赋值与交换

  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。

  • assign(n, elem); //将n个elem拷贝赋值给本身。

  • list& operator=(const list &lst); //重载等号操作符

  • swap(lst); //将lst与本身的元素互换。

大小操作

  • size(); //返回容器中元素的个数

  • empty(); //判断容器是否为空

  • resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

插入和删除

  • push_back(ele); //在容器尾部插入一个元素

  • pop_back();//删除容器最后一个元素

  • push_front(); //在容器开头插入一个元素

  • pop_front(); //在容器开头移除一个元素

  • insert(pos,ele); //在pos位置插ele元素的拷贝,返回数据的位置

  • insert(pos,n,ele);//在pos位置插入n个ele数据,无返回值

  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。

  • clear(); //移除容器中所有数据

  • erase(beg,end); //删除[beg,end)区间数据,返回下一个数据的位置

  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。

  • remove(elem);//删除容器中所有与elem值匹配的元素。

数据存取

  • front(); //返回第一个元素

  • back(); //返回最后一个元素

注意,没有at或者下标因为不是连续存储

反转和排序

  • reverse(); //反转链表

  • sort(); //链表排序 已有数据类型默认排序规则比较按照**operator<**进行比较

    //若是自定义数据类型,可以在自定义数据类型中重载比较运算符

//或者提供自定义比较函数然后在sort()中传入这个函数

例如:

cpp 复制代码
bool ComparePerson(const Person& p1, const Person& p2) {
​
    if (p1.m_Age == p2.m_Age) {  
        return p1.m_Height  > p2.m_Height; //再按身高从大到小
    }
    else
    {
        return  p1.m_Age < p2.m_Age;  //先按年龄从小到大排序
    } 
​
}
相关推荐
泡泡鱼(敲代码中)8 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
老赵的博客8 小时前
c++面试之从虚函数表到Rtti一次性讲清楚
c++·qt
潜创微科技9 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu9 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊9 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
cvby10 小时前
C++11
开发语言·c++
6Hzlia10 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
夜不会漫长11 小时前
C++:类和对象(2)
java·javascript·c++
ch.ju11 小时前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
无小道11 小时前
C++ 中 `explicit` 关键字详解:彻底理解隐式类型转换
c++·explicit