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;  //先按年龄从小到大排序
    } 
​
}
相关推荐
时光の尘5 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
我们的五年9 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
以后不吃煲仔饭18 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师19 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者23 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟25 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟43 分钟前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
初九之潜龙勿用1 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn