当前位置: 首页 > news >正文

C++入门9——list的使用

目录

1.什么是list?

2.list的构造 

3.list迭代器的使用(list iterator) 

4.list capacity

5.list modifiers

6.list的其他操作


1.什么是list?

在官网中,对list有这样的介绍:

Lists are sequence containers that allow constant time insert and erase operations anywhere within the sequence, and iteration in both directions.

即:list是允许在序列中的任何位置进行恒定时间的插入和删除操作的序列容器,并且可以双向迭代。 

于是对list便有这样的介绍:

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,以让其更简单高效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的影响因素)

2.list的构造 

list的常见构造有:

①list()——构造空的list;

②list (size_type n, const value_type& val = value_type())——构造一个有n个值为val的元素的list;

③list (const list& x)——拷贝构造函数;

④list (InputIterator first, InputIterator last)——用[first, last)区间中的元素构造list。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l1;//①构造空的listlist<int> l2(4, 200);//②构造一个有n个值为val的元素的listlist<int> l3(l2);//③l2拷贝构造l3list<int> l4(l2.begin(), l2.end());//用l2的[begin(),end())构造l4//范围for遍历l1、l2、l3、l4for (auto e : l1){cout << e << " ";}cout << endl;for (auto e : l2){cout << e << " ";}cout << endl;for (auto e : l3){cout << e << " ";}cout << endl;for (auto e : l4){cout << e << " ";}cout << endl;return 0;
}

3.list迭代器的使用(list iterator) 

在之前的文章中我们就说过,可以将迭代器看做一个指针(当然底层并不完全是指针),在这里,我们理解为该指针指向list中的某个节点。

①begin+end——返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器;

②rbegin+rend——返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的 reverse_iterator,即begin位置。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);//注意list只能用范围for和迭代器访问//使用正向迭代器访问l中的元素list<int>::iterator it = l.begin();{while (it != l.end()){cout << *it << " ";++it;}cout << endl;}//使用反向迭代器访问l中的元素list<int>::reverse_iterator rit = l.rbegin();{while (rit != l.rend()){cout << *rit << " ";++rit;}cout << endl;}return 0;
}

4.list capacity

①empty——检测list是否为空,是返回true,否则返回false;

②size——返回list中有效节点的个数。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);if (!l.empty()){cout << l.size() << endl;}return 0;
}

5.list modifiers

①push_front——在list首元素前插入值为val的元素;

②pop_front——删除list中第一个元素;

③push_back——在list尾部插入值为val的元素;

④pop_back——删除list中最后一个元素;

⑤insert——在list position 位置中插入值为val的元素;

⑥erase——删除list position位置的元素;

⑦swap——交换两个list中的元素;

⑧clear——清空list中的有效元素。

#include <iostream>#include<list>using namespace std;int main()
{list<int> l(4, 200);l.push_front(100);//在list首元素前插入值为val的元素;for (auto e : l){cout << e << " ";}cout << endl;l.pop_front();//删除list中第一个元素;for (auto e : l){cout << e << " ";}cout << endl;l.push_back(300);//在list尾部插入值为val的元素;for (auto e : l){cout << e << " ";}cout << endl;l.pop_back();//删除list中最后一个元素;for (auto e : l){cout << e << " ";}cout << endl;l.insert(++l.begin(), 150);//在begin()+1位置插入150for (auto e : l){cout << e << " ";}cout << endl;l.erase(++l.begin());//删除begin()+1位置的数据for (auto e : l){cout << e << " ";}cout << endl;list<int> ll(3, 100);cout << "交换前l=";for (auto e : l){cout << e << " ";}cout << "ll=";for (auto e : ll){cout << e << " ";}cout << endl;l.swap(ll);//交换l与ll的元素cout << "交换后l=";for (auto e : l){cout << e << " ";}cout << "ll=";for (auto e : ll){cout << e << " ";}cout << endl;l.clear();for (auto e : l){cout << e << " ";}cout << endl;return 0;
}

6.list的其他操作

 ①reverse——对list逆置;

②sort——对list排序;

③merge——将两个有序list归并为一个有序的list(无序时可调用sort先排序);

④unique——去重(去重要求所有相同的值要相邻,所以在使用unique之前最好也先调用sort);

⑤remove——相当于find+erase;

#include <iostream>
#include <list>using namespace std;int main()
{list<int> l1;l1.push_back(4);l1.push_back(2);l1.push_back(3);l1.push_back(1);cout << "排序前:";for (auto e : l1){cout << e << " ";}cout << endl;l1.sort();//排序cout << "排序后:";for (auto e : l1){cout << e << " ";}cout << endl;l1.reverse();cout << "逆置后:";//逆置for (auto e : l1){cout << e << " ";}cout << endl;list<int> l2,l3;l2.push_back(4);l2.push_back(2);l2.push_back(3);l2.push_back(1);l3.push_back(4);l3.push_back(4);l3.push_back(5);l3.push_back(7);l2.sort();l3.sort();l2.merge(l3);//归并for (auto e : l2){cout << e << " ";}cout << endl;l2.unique();//去重for (auto e : l2){cout << e << " ";}cout << endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue增加长时间无操作退出登录功能
  • C# 数组定义和常用方法
  • AI 浪潮中的一体化数据库|外滩大会之OceanBase实录
  • P1308 [NOIP2011 普及组] 统计单词数
  • aliyun图片存储OSS工具类
  • Cesium 问题:视角漫游时添加的无人机模型飞行时有抖动
  • 【软考】设计模式之责任链模式
  • Tube Qualify三维弯管测量系统用于弯管机修正弯管回弹参数
  • 一维数组的概念和应用
  • Excel单元格操作:读写单元格数据、格式设置与条件格式详解
  • 1.C_数据结构_基本知识
  • 第4章-03-用WebDriver获取页面Cookie
  • HarmonyOS开发5.0【rcp网络请求】
  • 【Android笔记】Android Studio打包 提示Invalid keystore format
  • OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android系统模拟器绘制实现概述
  • Angular Elements 及其运作原理
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • exports和module.exports
  • js 实现textarea输入字数提示
  • LeetCode29.两数相除 JavaScript
  • MYSQL 的 IF 函数
  • mysql中InnoDB引擎中页的概念
  • October CMS - 快速入门 9 Images And Galleries
  • Python学习之路16-使用API
  • Redis中的lru算法实现
  • windows下mongoDB的环境配置
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 最简单的无缝轮播
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Nginx实现动静分离
  • python最赚钱的4个方向,你最心动的是哪个?
  • # dbt source dbt source freshness命令详解
  • ###C语言程序设计-----C语言学习(3)#
  • #pragma multi_compile #pragma shader_feature
  • #pragma once与条件编译
  • (¥1011)-(一千零一拾一元整)输出
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十)c52学习之旅-定时器实验
  • (一)认识微服务
  • (转)编辑寄语:因为爱心,所以美丽
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./和../以及/和~之间的区别
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net MVC + EF搭建学生管理系统
  • .net2005怎么读string形的xml,不是xml文件。
  • .Net6使用WebSocket与前端进行通信
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)