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

news2025/1/21 1:03:26

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 .两者都提供了迭代器,且迭代器都支持随机访问


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文搞懂机器学习

一、引言 在当今的数字时代&#xff0c;一个概念不断出现在科技前沿的讨论中 —— 机器学习。作为人工智能领域的一个重要分支&#xff0c;机器学习已经从理论研究走向实际应用&#xff0c;深刻地改变着我们的工作和生活方式。 机器学习的核心思想是让机器通过数据学习并做出…

《1w实盘and大盘基金预测 day7》

昨日预测有点差劲&#xff0c;最低点也相差五个点。 打分C 公众号&#xff1a;JavaHelmet 昨天预测&#xff1a; 3052-3062-3076-3115 3067是趋势线&#xff0c;有回踩需求 5-30-60分钟级别顶钝 大盘冲到标红的点位3115或者3100就需注意。不要随意追高&#xff08;最高309…

稀碎从零算法笔记Day22-LeetCode:存在重复元素 II

题型&#xff1a;哈希表、数组 链接&#xff1a;219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] …

幻兽帕鲁游戏搭建(docker)

系列文章目录 第一章&#xff1a; 幻兽帕陆游戏搭建 文章目录 系列文章目录前言一、镜像安装1.创建游戏目录2.拉取镜像3.下载配置文件4.启动游戏 二、自定义配置总结 前言 这段时间一直在写论文还有找工作&#xff0c;也没学啥新技术&#xff0c;所以博客也很长时间没写了&am…

【Python】使用selenium对Poe批量模拟注册脚本

配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…

5 Redis主从集群

文章目录 Redis主从集群1.1主从集群搭建1.1.1 伪集群搭建与配置1.1.2 分级管理1.1.3 容灾冷处理 1.2主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程 2.1 哨兵机制实现2.1.1 简介2.2.2 Redis 高可用集群搭建2.2.3 Redis 高可用集群的启动2.2.4 Sentinel 优化配置 3.1 哨…

Springboot 博客_002 项目环境配置

引入相关依赖 mysqlmybatis <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-…

[小程序开发] 常见问题2:npm init -y 报错

在微信开发者工具终端中输入npm init -y 报错 npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包 括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 原因&#xff1a;未下载Node.js 解决方法&#xff…

窗口函数(sample database classicmodels _No.8 )

窗口函数&#xff08;sample database classicmodels _No.8 &#xff09; 准备工作&#xff0c;可以去下载 classicmodels 数据库具体如下 点击&#xff1a;classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章目录 窗口函…

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

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

Git浅谈配置文件和免密登录

一、文章内容 简述git三种配置ssh免密登录以及遇见的问题git可忽略文件git remote 相关操作 二、Git三种配置 项目配置文件(局部)&#xff1a;项目路径/.git/config 文件 git config --local user.name name git config --local user.email 123qq.cc全局配置文(所有用户): …

docker入门(二)—— docker三大概念(镜像、容器、仓库)

docker 的三大必要概念 docker 的三大必要概念——镜像、容器、仓库 docker 架构图 镜像&#xff08;image&#xff09;&#xff1a;模版。&#xff08;web项目&#xff1a;1、环境 2、配置变量 3、上线项目 4、配置项目需要的静态文件&#xff09;打包成镜像 docker 镜像&a…

LeetCode 2312.卖木头块:动态规划(DP)

【LetMeFly】2312.卖木头块&#xff1a;动态规划(DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/selling-pieces-of-wood/ 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, …

DNF的概念和操作命令

yum是linux系统中基于rpm包管理的一种软件管理工具。 在dnf.conf文件中&#xff0c;我们可以配置某个网络服务器位软件源仓库。配置的方法&#xff0c;就是用vim编辑/etc/dnf/dnf.conf这个文件。

基于 RisingWave 和 Kafka 构建实时网络安全解决方案

实时威胁检测可实时监控和分析数据&#xff0c;并及时对潜在的安全威胁作出识别和响应。与依赖定期扫描或回顾性分析的安全措施不同&#xff0c;实时威胁检测系统可提供即时警报&#xff0c;并启动自动响应来降低风险&#xff0c;而不会出现高延迟。 实时威胁检测有许多不同的…

C语言案例02,请编程序将“China“译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母,变为Glmre,持续更新~

一.题目 /* 请编程序将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”&#xff0c;用“E”代替“A”。因此,“China”应译为“Glmre”。 请编一程序,用赋初值的方法使cl,c2&#xff0c;c3,c4,c5 这5个变量的值分…

避坑指南!树莓派使用Adafruit_PCA9685驱动

一、硬件连线 二、软件配置 打开树莓派的IIC sudo raspi-config下载Adafruit_PCA9685 坑&#xff1a;如果直接使用命令安装会发现&#xff0c;报下面的错误。我们需要先安装conda&#xff0c;然后创建一个虚拟环境&#xff0c;创建完成后&#xff0c;激活环境。不要在自己创…

Python自动化测试UniTest框架介绍用法

UnitTest是Python自带的一个单元测试框架 作用&#xff1a; 批量执行用例提供丰富的断言知识可以生成报告 核心要素&#xff1a; TestCase 测试用例TestSuite 测试案件TestRunner 以文本的形式运行测试用例TestLoader 批量执行测试用例-搜索指定文件夹内指定字母开头的模块F…

2024/03/19(网络编程·day5)

一、思维导图 二、selec函数实现TCP并发服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.116" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOC…

【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文件里保存…