即链表

将数据进行链式存储

stl中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

  • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

list构造函数

函数原型:

  • list<T> lst; //list采用采用模板类实现,对象的默认构造形式:
  • list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
  • list(n,elem); //构造函数将n个elem拷贝给本身。
  • list(const list &lst); //拷贝构造函数。
void print(const list<int>&l)
{for(list<int>::const_iterator it=l.begin();it!=l.end();it++){cout<<*it<<" ";}cout<<endl;
}int main()
{list<int>l;l.push_back(10);l.push_back(20);l.push_back(30);l.push_back(40);print(l);//区间构造list<int>l2(l.begin(),l.end());print(l2);//拷贝构造list<int>l3(l2);print(l3);//n个elemlist<int>l4(10,1000);print(l4);
}

list赋值和交换

函数原型:

  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem); //将n个elem拷贝赋值给本身。
  • list& operator=(const list &lst); //重载等号操作符
  • swap(lst); //将lst与本身的元素互换
    list<int>l1;l1.push_back(10);l1.push_back(20);l1.push_back(30);print(l1);list<int>l2;l2=l1;print(l2);list<int>l3;l3.assign(l2.begin(),l2.end());print(l3);list<int>l4;l4.assign(10,1000);print(l4);

list大小操作

函数原型:

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

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

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

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

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

                         //如果容器变短,则末尾超出容器长度的元素被删除。
    
    list<int>l1;l1.push_back(10);l1.push_back(20);l1.push_back(30);//判断容器是否为空if(!l1.empty()){cout<<"l1 is not empty"<<endl;}else{cout<<"l1 is empty"<<endl;}//重新指定大小、l1.resize(10);print(l1);//查看大小cout<<"l1's size is:"<<l1.size()<<endl;

list容器插入和删除

函数原型:

  • push_back(elem);//在容器尾部加入一个元素
  • pop_back();//删除容器中最后一个元素
  • push_front(elem);//在容器开头插入一个元素
  • pop_front();//从容器开头移除第一个元素
  • insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();//移除容器的所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。
  • remove(elem);//删除容器中所有与elem值匹配的元素。

insert()和erase()都要提供迭代器

    list<int>l1;for(int i=0;i<10;i++){l1.push_back(i);}print(l1);//insert插入list<int>::iterator it=l1.begin();l1.insert(it++,100);print(l1);//删除l1.erase(l1.begin(),++it);print(l1);//移除l1.remove(5);print(l1);

list数据存取

函数原型:

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

注意:list不支持 at() 和 [] 访问数据

list反转和排序

功能描述:

  • 将容器中的元素反转,以及将容器中的数据进行排序

函数原型:

  • reverse(); //反转链表
  • sort(); //链表排序
bool my_compare(int v1,int v2)
{//降序,就让第一个数>第二个数return v1>v2;
}int main()
{list<int>l1;for(int i=0;i<10;i++){l1.push_back(i);}print(l1);l1.reverse();print(l1);l1.push_back(10);l1.push_back(20);//所有不支持随机访问的容器不支持标准算法//不支持随机访问的容器,内部会提供对应的算法l1.sort(my_compare);print(l1);}

所有不支持随机访问的容器不支持标准算法

不支持随机访问的容器,内部会提供对应的算法

自定义数据类型排序案例

案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高

排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序

#include<iostream>
#include<list>
using namespace std;class person
{
public:person(string name,int age,int heigh){this->m_age=age;this->m_heigh=heigh;this->n_name=name;}string n_name;int m_age;int m_heigh;
};
//指定排序规则
bool my_compare(person &p1,person &p2)
{//按照年龄升序if(p1.m_age==p2.m_age){//年龄相同,按照身高降序return p1.m_heigh>p2.m_heigh;}else{return p1.m_age < p2.m_age;}
}int main()
{list<person>l;person p1("刘备",35,175);person p2("曹操",45,180);person p3("孙权",40,170);person p4("赵云",25,190);person p5("张飞",35,160);person p6("关羽",35,200);l.push_back(p1);l.push_back(p2);l.push_back(p3);l.push_back(p4);l.push_back(p5);l.push_back(p6);for(list<person>::iterator it=l.begin();it!=l.end();it++){cout<<"name: "<<(*it).n_name<<" age: "<<(*it).m_age<<"  heigh: "<<(*it).m_heigh<<endl;}cout<<endl;cout<<"-------after sort---------"<<endl;l.sort(my_compare);for(list<person>::iterator it=l.begin();it!=l.end();it++){cout<<"name: "<<(*it).n_name<<" age: "<<(*it).m_age<<"  heigh: "<<(*it).m_heigh<<endl;}
}

list(链表)容器相关推荐

  1. 线性结构--离散存储 链表讲解

    数据结构大体成上可以分成两种: 1. 线性结构. 2. 非线性结构( 树,图) 1. 什么是线性结构        大概上可以这样定义: 加入所有的节点可以用一条直线连接起来. 就是线性结构... 2 ...

  2. 数据结构和算法(05)---链表(c++)

    文章目录 目录 链表的基本概念 1.数组和链表 链表的使用 1.链表的简单使用 2.链表的进阶使用 3.链表的高阶使用 4.链表的其他操作 链表容器list 1.list介绍 2. list使用 3. ...

  3. 近万字带你了解“c++“STL中的各种容器

    目录 1.array容器 vector 和 array镶嵌使用 4.链表容器(list)是一个库封装好的一个双向链表 5.priority_queue: 优先队列 6.map和multimap 7.s ...

  4. 【内核链表】数据结构——深入理解内核链表的概念和操作笔记

    内核链表 一.内核链表的前置概念 1.容器 2.通用解决方案 二.通用型链表节点的设计 1.初始化 2.增删操作 3.查找节点 4.遍历链表 5.示例代码 三.内核链表 1.普通链表弊端 2.内核链表 ...

  5. 5. STL容器和算法使用

    STL Standard Template Library,标准模板库 六大组件 容器:存放数据 算法:操作数据 迭代器:算法通过迭代器操作容器数据 仿函数:为算法提供更多的策略 适配器:为算法提供更 ...

  6. c++模板类(链表),实现正向反向找到链表中最大值,并比较时间差异

    问题描述 实现链表容器模板类,利用模板实现找到公司中工资最高的员工的工资,实现正向反向查找,并且比较两种方法的时间差异. 代码实现 公司类Company.h #ifndef COMPCONT_H #d ...

  7. STL(标准模板库)--容器(一)

    STL-----容器 1. 序列容器 1.1 array 1.2 vector 1.3 deque 1.4 list 1.5 容器中常见的函数成员 2. 容器适配器 2.1 stack 2.2 que ...

  8. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  9. 一文快速理解C++容器

    容器 一个容器是特定类型对象的集合,在C++标准库中包含了大部分常见的容器.STL 是"Standard Template Library"的缩写,中文译为"标准模板库& ...

  10. 组合模式(Composite Pattern)

    组合模式概述 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.又被成为"部分-整体"(Part-Whole)模式, ...

最新文章

  1. 会声会影水墨遮罩如何变大_自媒体长期网赚项目: 自媒体如何打造自己的自媒体知识付费课程(干货)...
  2. 百万级数据库优化方案
  3. 南邮计算机图形学水不水,南邮计算机图形学实验报告(修正版)….doc
  4. python数据库增删改查_python实现数据库增删改查
  5. apache thrift_使用Java快速入门的Apache Thrift
  6. oracle批量update
  7. 安装Cocoapods,以及其中出现的问题
  8. libevent 例子,从简单到复杂
  9. Ubuntu18.04下安装配置ORB_SLAM2以及过程中遇到的问题解决方法
  10. 智能电网调度技术支持系统建设方案
  11. GitHub 加速神器, 来了!
  12. 微信小程序绘制图表(折线图、柱状图)
  13. g729源码分析-开篇
  14. imx6ull-arm开发板和电脑网线直连通信
  15. 多渠道打包,生成不同包名的包
  16. java 中如何检测异常_如何检测Java中何时全局抛出了异常?
  17. 信号完整性与电源完整性分析 第三版 pdf_电源完整性,信号完整性,你说哪个更重要一点?...
  18. 快速入门Kotlin
  19. cin和cout的使用
  20. 如何辨别上市公司财务造假

热门文章

  1. cte公用表表达式_SQL Server中的CTE; 查询公用表表达式
  2. Linux上SQL Server 2019和Ubuntu上的Docker容器
  3. sql server 监视_使用SQL Server Reporting Services进行快速,肮脏的服务器监视
  4. ta-lib 里的蜡烛图形态函数源码
  5. 洛谷 P3396 哈希冲突 解题报告
  6. ubuntu 中文设置
  7. vue-cli watch简单用法
  8. C#,一种简单的方式实现滚动鼠标缩放图片,平移
  9. Transactional ejb 事务陷阱
  10. 杨潮观《偷桃捉住东方朔》