【STL】List容器介绍+相关练习题详细版本

List

  • 1.List介绍
  • 2.使用注意
  • 3.list与vector的对比
  • 4.练习题

1.List介绍

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)
    List:帮助文档
    相关接口函数可以查看帮助文档,这里主要介绍一下关键点。

2.使用注意

  1. end()迭代器:返回的是最后一个元素的下一位置。
  2. 迭代器失效问题

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

3.list与vector的对比

vector与list都是STL中非常重要的序列式容器,由于两个容器的底层结构不同,导致其特性以及应用场景不同,其主要不同如下:
00

4.练习题

1 题(单选题)

题目名称:

下面有关vector和list的区别,描述错误的是(**D** )

题目内容:

**A** .vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机存取,应该使用vector

**B** .list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list

**C** .vector<int>::iterator支持“+”、“+=”、“<”等操作符

**D** .list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[ ]运算符

第 2 题(单选题)

题目名称:

以下程序输出结果为( )

int main(**C**)

{

int ar[] = { 0,1, 2, 3, 4, 5, 6, 7, 8, 9 };

int n = sizeof(ar) / sizeof(int);

list<int> mylist(ar, ar+n);

list<int>::iterator pos = find(mylist.begin(), mylist.end(), 5);

reverse(mylist.begin(), pos);

reverse(pos, mylist.end());

list<int>::const_reverse_iterator crit = mylist.crbegin();

while(crit != mylist.crend())

{

cout<<*crit<<" ";

++crit;

}

cout<<endl;

}



题目内容:

**A** .4 3 2 1 0 5 6 7 8 9

**B** .0 1 2 3 4 9 8 7 6 5

**C** .5 6 7 8 9 0 1 2 3 4

**D** .5 6 7 8 9 4 3 2 1 03 题(单选题)

题目名称:

以下代码实现了从表中删除重复项的功能,请选择其中空白行应填入的正确代码(**B** )

template<typename T>

void removeDuplicates(list<T> &aList)

{

T curValue;

list<T>::iterator cur, p;

cur = aList.begin();

while (cur != aList.end())

{

curValue = *cur;

//空白行 1

while (p != aList.end())

{

if (*p == curValue)

{

//空白行 2

}

else

{

p++;

}

}

}

}



题目内容:

**A** . p=cur+1;aList.erase(p++);

**B** .p=++cur; p == cur ? cur = p = aList.erase(p) : p = aList.erase(p);

**C** .p=cur+1;aList.erase(p);

**D** .p=++cur;aList.erase(p);4 题(编程题)

题目名称:

list的增删查改的模拟实现

题目内容:

模拟实现list类,并完成测试

namespace bite

{

 // List的节点类

 template<class T>

 struct ListNode

 {

  ListNode(const T& val = T());

  ListNode<T>* _pPre;

  ListNode<T>* _pNext;

  T _val;

 };



 //List的迭代器类

 template<class T, class Ref, class Ptr>

 class ListIterator

 {

  typedef ListNode<T>* PNode;

  typedef ListIterator<T, Ref, Ptr> Self;

 public:

  ListIterator(PNode pNode = nullptr)ListIterator(const Self& l);

  T& operator*();

  T* operator->();

  Self& operator++();

  Self operator++(int);

  Self& operator--();

  Self& operator--(int);

  bool operator!=(const Self& l)bool operator==(const Self& l)private:

  PNode _pNode;

 };



 //list类

 template<class T>

 class list

 {

  typedef ListNode<T> Node;

  typedef Node* PNode;

 public:

  typedef ListIterator<T, T&, T*> iterator;

  typedef ListIterator<T, const T&, const T&> const_iterator;

 public:

  ///

  // List的构造

  list();

  list(int n, const T& value = T());

  template <class Iterator>

  list(Iterator first, Iterator last);

  list(const list<T>& l);

  list<T>& operator=(const list<T> l);

  ~list();



  ///

  // List Iterator

  iterator begin();

  iterator end();

  const_iterator begin();

  const_iterator end();



  ///

  // List Capacity

  size_t size()const;

  bool empty()const;



  

  // List Access

  T& front();

  const T& front()const;

  T& back();

  const T& back()const;



  

  // List Modify

  void push_back(const T& val){insert(begin(), val);}

  void pop_back(){erase(--end());}

  void push_front(const T& val){insert(begin(), val);}

  void pop_front(){erase(begin());}

  // 在pos位置前插入值为val的节点

  iterator insert(iterator pos, const T& val);

  // 删除pos位置的节点,返回该节点的下一个位置

  iterator erase(iterator pos);

  void clear();

  void swap(List<T>& l);

 private:

  void CreateHead();

  PNode _pHead;

 };

};
1 题(单选题)

题目名称:

下面程序的输出结果正确的是(**B** )

int main()

{

int array[] = { 1, 2, 3, 4, 0, 5, 6, 7, 8, 9 };

int n = sizeof(array) / sizeof(int);

list<int> mylist(array, array+n);

auto it = mylist.begin();

while (it != mylist.end())

{

if(* it != 0)

cout<<* it<<" ";

else

it = mylist.erase(it);

++it;

}

return 0;

}

//这里it==5 erase之后指向下一个元素的迭代器

**改造一下保留5**

```c++
int array[] = { 1, 2, 3, 4, 0, 5, 6, 7, 8, 9 };

	int n = sizeof(array) / sizeof(int);

	list<int> mylist(array, array + n);

	auto it = mylist.begin();

	while (it != mylist.end())

	{

		if (*it != 0)
		{
			cout << *it << " ";
			++it;
		}

			

		else

			it = mylist.erase(it);//这里it==5 erase之后指向下一个元素的迭代器


	}

题目内容:

A .1 2 3 4 5 6 7 8 9

B . 1 2 3 4 6 7 8 9

C .程序运行崩溃

D .1 2 3 4 0 5 6 7 8 9

第 2 题(单选题)

题目名称:

对于list有迭代器it, 当erase(it)后,说法错误的是(C )

题目内容:

A .当前迭代器it失效

B .it前面的迭代器仍然有效

C .it后面的迭代器失效

D .it后面的迭代器仍然有效

第 3 题(单选题)

题目名称:

下面有关vector和list的区别,描述错误的是( D)

题目内容:

A .vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随机读取,应该使用vector

B .list拥有一段不连续的内存空间,如果需要大量的插入和删除,应该使用list

C .vector::iterator支持“+”、“+=”、“<”等操作符

D .list::iterator则不支持“+”、“+=”、“<”等操作符运算,但是支持了[]运算符

第 4 题(单选题)

题目名称:

下面有关vector和list的区别,描述正确的是( A)

题目内容:

A .两者在尾部插入的效率一样高

B .两者在头部插入的效率一样高

C .两者都提供了push_back和push_front方法

D .两者都提供了迭代器,且迭代器都支持随机访问


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

索引常见面试题

面试中&#xff0c;MySQL 索引相关的问题基本都是一系列问题&#xff0c;都是先从索引的基本原理&#xff0c;再到索引的使用场景&#xff0c;比如&#xff1a; 索引底层使用了什么数据结构和算法&#xff1f;为什么 MySQL InnoDB 选择 Btree 作为索引的数据结构&#xff1f;什…

5_springboot_shiro_jwt_多端认证鉴权_禁用Cookie

1. Cookie是什么 ​ Cookie是一种在客户端&#xff08;通常是用户的Web浏览器&#xff09;和服务器之间进行状态管理的技术。当用户访问Web服务器时&#xff0c;服务器可以向用户的浏览器发送一个名为Cookie的小数据块。浏览器会将这个Cookie存储在客户端&#xff0c;为这个Co…

30.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据搜索功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;29.数据推测功能…

从爬楼梯到斐波那契数列:解密数学之美

题目描述 我们来看看力扣的一道经典问题70. 爬楼梯 递归 假设n级台阶有climbStairs(n)种方法爬到楼梯顶。如果有n级台阶&#xff0c;如果第一次往上爬1级台阶&#xff0c;就会剩下n-1级台阶&#xff0c;这n-1级台阶就有climbStairs(n-1)种方法爬到楼梯顶&#xff1b;如果第一…

【Week Y2】使用自己的数据集训练YOLO-v5s

Y2-使用自己的数据集训练YOLO-v5s 零、遇到的问题汇总&#xff08;1&#xff09;遇到git的import error&#xff08;2&#xff09;Error&#xff1a;Dataset not found&#xff08;3&#xff09;Error&#xff1a;删除中文后&#xff0c;训练图片路径不存在 一、.xml文件里保存…

【MySQL】MySQL视图

文章目录 一、视图的基本使用1.创建视图2.修改了视图&#xff0c;对基表数据有影响3.修改了基表&#xff0c;对视图有影响4.删除视图 二、视图规则和限制 一、视图的基本使用 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称…

Vulnhub - Jarbas

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Jarbas 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/jarbas-1,232/ 0x01 信息收集 Nmap…

机器学习/深度学习绘图模板(PPT)

机器学习/深度学习绘图模板(PPT) 34页PPT&#xff0c;包含40图片模板 部分标注了论文出处 点击&#xff1a;我的B站工房 购买&#xff0c;粉丝专享价4.9元&#xff0c;线上交付&#xff0c;支付后自动发货。

Android Studio实现内容丰富的安卓民宿酒店预订平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看民宿 3.民宿预订 4.民宿预订支付&#xff0c; 5.支付订单 6.评论管…

MySQL的基本概念

一.MySQL概念&#xff1a; 你可以把MySQL想象成一个大杂货店&#xff0c;里面有很多货架&#xff0c;每个货架上摆放着不同种类的商品&#xff0c;MySQLMySQ就像是这个杂货店的后台库存管理系统。 1.表格&#xff08;货架&#xff09;&#xff1a;每个货架上摆放商品&#xff0…

Linux入门级别命令(下载远程连接工具)

$pwd&#xff08;当前所在位置&#xff0c;显示打印当前工作目录&#xff09;$mkdir 创建目录$cd dir 换个位置&#xff08;进入某一个目录&#xff09;$cd 什么都不加回到最开始的目录$ls当前目录位置下的文件信息&#xff08;列出当前所在位置下有哪些东西&#xff09;$mv移动…

Visual Studio 2013 - 调试模式下根据内存地址查看内存

Visual Studio 2013 - 调试模式下根据内存地址查看内存 1. 查看内存References 1. 查看内存 调试 -> 窗口 -> 内存 -> 内存1-4 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

全栈的自我修养 ———— 让uniapp开发更加舒服!!(与别的博主思路不一样,小编这里只讲实用的,直提重点!)

小编是web的&#xff0c;然后现在开始接手微信小程序&#xff0c;有很多不习惯的的地方&#xff0c;经过一段时间的使用&#xff0c;部分得到了妥善的解决方法 一、用vscode开发小程序二、组件库的选择三、注意 一、用vscode开发小程序 发现用Hbuilder开发小程序有很多不习惯的…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

默写单词cpp(初学者版本)

笔摔坏了直接使用版:yum:仔细学习版:yum:1.直接使用版:yum:&#xff08;文件使用规范&#xff09;(1)文件(2)使用规范 2.仔细学习版。将会讲各个函数的功能和细节。今天太晚了&#xff0c;明天再写。 笔摔坏了 在一个阳光明媚的早晨&#xff0c;我愉快的奋笔疾书&#xff0c;抄…

Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)

目录 一、前置说明 二、Gradle 启动&#xff01; 2.1、安装 2.2、初始化项目 2.3、gradle 项目目录介绍 2.4、Gradle 项目下载慢&#xff1f;&#xff08;万能解决办法&#xff09; 2.5、Gradle 常用命令 2.6、项目构建流程 2.7、设置文件&#xff08;settings.gradle.…

docker入门(三)—— 安装docker

docker 安装 环境要求 本次使用的是云服务器&#xff0c;版本是 centos&#xff0c;要求版本在3.10以上 [rootiZbp15293q8kgzhur7n6kvZ /]# uname -r 3.10.0-1160.108.1.el7.x86_64 [rootiZbp15293q8kgzhur7n6kvZ /]# cat /etc/os-release NAME"CentOS Linux" VE…

数据容器-list-Python

师从黑马程序员 列表的定义语法 注&#xff1a;列表可以一次存储多个数据&#xff0c;且可以为不同的数据类型&#xff0c;支持嵌套 my_list["itheima","chengxuyuan","python"] print(my_list) print(type(my_list))#元素类型不受限 my_list[&…

架构扩展性

架构扩展性&#xff1a;应用扩展 数据扩展 组织扩展 流程扩展 核心方法论–扩展立方体&#xff1a; x轴&#xff1a;无脑克隆 y轴&#xff1a;功能分割z轴&#xff1a;客户分割扩展立方体在应用扩展的应用&#xff1a; x轴&#xff1a;横向克隆 对于无状态的应用&#xff0c;多…

vue3封装对话框el-dialog组件

实现逻辑&#xff1a; 1、引入对话框组件&#xff1b; 2、组件使用&#xff1b; 3、点新增和编辑的时候&#xff0c;通过ref调用对话框暴漏出来的方法&#xff0c;并传值&#xff1b; 4、关闭对话框时&#xff0c;封装方法&#xff0c;重置对话框的表单和重置校验&#xff1b; …