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;  //先按年龄从小到大排序
    } 
​
}
相关推荐
wdfk_prog1 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
闻道且行之3 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
绝世番茄4 小时前
鸿蒙HarmonyOS ArkTS原生拖拽排序深度解析
深度学习·华为·list·harmonyos·鸿蒙
许彰午4 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系5 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜5 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
c238566 小时前
Bug 猎手入门指南
c++·算法·bug
chouchuang7 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云空7 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen7 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang