list(链表)容器
即链表
将数据进行链式存储
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. 线性结构. 2. 非线性结构( 树,图) 1. 什么是线性结构 大概上可以这样定义: 加入所有的节点可以用一条直线连接起来. 就是线性结构... 2 ...
- 数据结构和算法(05)---链表(c++)
文章目录 目录 链表的基本概念 1.数组和链表 链表的使用 1.链表的简单使用 2.链表的进阶使用 3.链表的高阶使用 4.链表的其他操作 链表容器list 1.list介绍 2. list使用 3. ...
- 近万字带你了解“c++“STL中的各种容器
目录 1.array容器 vector 和 array镶嵌使用 4.链表容器(list)是一个库封装好的一个双向链表 5.priority_queue: 优先队列 6.map和multimap 7.s ...
- 【内核链表】数据结构——深入理解内核链表的概念和操作笔记
内核链表 一.内核链表的前置概念 1.容器 2.通用解决方案 二.通用型链表节点的设计 1.初始化 2.增删操作 3.查找节点 4.遍历链表 5.示例代码 三.内核链表 1.普通链表弊端 2.内核链表 ...
- 5. STL容器和算法使用
STL Standard Template Library,标准模板库 六大组件 容器:存放数据 算法:操作数据 迭代器:算法通过迭代器操作容器数据 仿函数:为算法提供更多的策略 适配器:为算法提供更 ...
- c++模板类(链表),实现正向反向找到链表中最大值,并比较时间差异
问题描述 实现链表容器模板类,利用模板实现找到公司中工资最高的员工的工资,实现正向反向查找,并且比较两种方法的时间差异. 代码实现 公司类Company.h #ifndef COMPCONT_H #d ...
- STL(标准模板库)--容器(一)
STL-----容器 1. 序列容器 1.1 array 1.2 vector 1.3 deque 1.4 list 1.5 容器中常见的函数成员 2. 容器适配器 2.1 stack 2.2 que ...
- 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)
文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...
- 一文快速理解C++容器
容器 一个容器是特定类型对象的集合,在C++标准库中包含了大部分常见的容器.STL 是"Standard Template Library"的缩写,中文译为"标准模板库& ...
- 组合模式(Composite Pattern)
组合模式概述 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.又被成为"部分-整体"(Part-Whole)模式, ...
最新文章
- 会声会影水墨遮罩如何变大_自媒体长期网赚项目: 自媒体如何打造自己的自媒体知识付费课程(干货)...
- 百万级数据库优化方案
- 南邮计算机图形学水不水,南邮计算机图形学实验报告(修正版)….doc
- python数据库增删改查_python实现数据库增删改查
- apache thrift_使用Java快速入门的Apache Thrift
- oracle批量update
- 安装Cocoapods,以及其中出现的问题
- libevent 例子,从简单到复杂
- Ubuntu18.04下安装配置ORB_SLAM2以及过程中遇到的问题解决方法
- 智能电网调度技术支持系统建设方案
- GitHub 加速神器, 来了!
- 微信小程序绘制图表(折线图、柱状图)
- g729源码分析-开篇
- imx6ull-arm开发板和电脑网线直连通信
- 多渠道打包,生成不同包名的包
- java 中如何检测异常_如何检测Java中何时全局抛出了异常?
- 信号完整性与电源完整性分析 第三版 pdf_电源完整性,信号完整性,你说哪个更重要一点?...
- 快速入门Kotlin
- cin和cout的使用
- 如何辨别上市公司财务造假