【STL详解 —— list的介绍及使用】

STL详解 —— list的介绍及使用

  • list的介绍
  • list的介绍使用
    • list的构造
    • list iterator的使用
    • list capacity
    • list element access
    • list modifiers
  • 示例
  • 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来说这
    可能是一个重要的因素)

list的介绍使用

list的构造

  1. 默认构造函数:创建一个空的list容器。
	list<int> v;
  1. 填充构造函数:创建一个具有特定大小的list,可以指定元素的初始值。
	list(size_type n,const value_type& val = value_type())
  1. 拷贝构造函数: 通过复制另一个list来创建一个新的list。
	list (const list& x)
  1. 范围构造函数:通过复制另一个容器或数组的元素范围来创建list。
	list (Inputlterator first, Inputlterator last)//用[first,last)区间中的元素构造list

示例:

	list<int> l1;                         // 构造空的l1list<int> l2(4, 100);                 // l2中放4个值为100的元素list<int> l3(l2.begin(), l2.end());  // 用l2的[begin(), end())左闭右开的区间构造l3list<int> l4(l3);                    // 用l3拷贝构造l4// 以数组为迭代器区间构造l5int array[] = { 16,2,77,29 };list<int> l5(array, array + sizeof(array) / sizeof(int));// 列表格式初始化C++11list<int> l6{ 1,2,3,4,5 };

list iterator的使用

此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。

  1. begin()
iterator begin();const_iterator begin() const;
  1. end()
iterator end();const_iterator end() const;
  1. rbegin()
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
  1. rend()
reverse_iterator rend();
const_reverse_iterator rend() const;

在这里插入图片描述

示例

	// 用迭代器方式打印l1中的元素list<int>::iterator it = l1.begin();while (it != l1.end()){cout << *it << " ";++it;}       cout << endl;// C++11范围for的方式遍历for (auto& e : l1)cout << e << " ";cout << endl;

list capacity

  1. empty()
    检测list是否为空,是返回true,否则返回false
bool empty() const;
  1. size()
    返回list中有效节点的个数
size_type size() const;

示例:

list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto& e : lt){cout << e << " ";}cout << endl;cout << "lt.size = " << lt.size() << endl;

在这里插入图片描述

list element access

  1. front()
    返回list的第一个节点中值的引用
T& front();
  1. back()
    返回list的最后一个节点中值的引l用
const T& front() const;

示例:

list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto& e : lt){cout << e << " ";}cout << endl;lt.front()++;	//给lt的第一个元素+1lt.back()++;	//给lt的最后一个元素+1for (auto& e : lt){cout << e << " ";}cout << endl;cout << "lt.size = " << lt.size() << endl;

在这里插入图片描述

list modifiers

  1. push_front()
    在list首元素前插入值为val的元素
	void push_front (const value_type& val); 
  1. pop front()
    删除list中第一个元素
void pop_front();
  1. push back()
    在list尾部插入值为val的元素
void push_back (const value_type& val);
  1. pop back()
    删除list中最后一个元素
void pop_back();
  1. insert()
    在listposition位置中插入值为val的元素
single element (1):	iterator insert (iterator position, const value_type& val);fill (2)	:void insert (iterator position, size_type n, const value_type& val);range (3)	:template <class InputIterator>    void insert (iterator position, InputIterator first, InputIterator last);
  1. erase()
    删除listposition位置的元素
iterator erase (iterator position);iterator erase (iterator first, iterator last);
  1. swap()
    交换两个list中的元素
void swap (list& x);
  1. clear()
    清空list中的有效元素

示例

void clear();
#include <iostream>
#include <list>using namespace std;int main() {// 创建一个空的 listlist<int> mylist;// push_front 在 list 首元素前插入值为 val 的元素mylist.push_front(10);mylist.push_front(20);mylist.push_front(30);// 输出 list 中的元素cout << "List after push_front:";for (int& x : mylist) {cout << " " << x;}cout << endl;// pop_front 删除 list 中的第一个元素mylist.pop_front();// 输出 list 中的元素cout << "List after pop_front:";for (int& x : mylist) {cout << " " << x;}cout << endl;// push_back 在 list 尾部插入值为 val 的元素mylist.push_back(40);mylist.push_back(50);// 输出 list 中的元素cout << "List after push_back:";for (int& x : mylist) {cout << " " << x;}cout << endl;// pop_back 删除 list 中的最后一个元素mylist.pop_back();// 输出 list 中的元素cout << "List after pop_back:";for (int& x : mylist) {cout << " " << x;}cout << endl;// insert 在 list 中的 position 位置插入值为 val 的元素list<int>::iterator it = mylist.begin();advance(it, 1); // 将迭代器移动到第二个位置mylist.insert(it, 35);// 输出 list 中的元素cout << "List after insert:";for (int& x : mylist) {cout << " " << x;}cout << endl;// erase 删除 list 中的 position 位置的元素it = mylist.begin();advance(it, 2); // 将迭代器移动到第三个位置mylist.erase(it);// 输出 list 中的元素cout << "List after erase:";for (int& x : mylist) {cout << " " << x;}cout << endl;// 创建另一个 listlist<int> another_list = { 100, 200, 300 };// swap 交换两个 list 中的元素mylist.swap(another_list);// 输出交换后的 mylistcout << "mylist after swap:";for (int& x : mylist) {cout << " " << x;}cout << endl;// 输出交换后的 another_listcout << "another_list after swap:";for (int& x : another_list) {cout << " " << x;}cout << endl;// clear 清空 list 中的有效元素mylist.clear();// 输出清空后的 mylistcout << "mylist after clear:";for (int& x : mylist) {cout << " " << x;}cout << endl;return 0;
}

在这里插入图片描述

list的迭代器失效

前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节
点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代
器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

void TestListIterator1(){int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array+sizeof(array)/sizeof(array[0]));auto it = l.begin();while (it != l.end()){// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值l.erase(it);  ++it;}}// 改正
void TestListIterator()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array + sizeof(array) / sizeof(array[0]));auto it = l.begin();while (it != l.end()){l.erase(it++);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js可视化爬取数据生成当前热点词汇图

功能 可以爬取到很多数据&#xff0c;并且生成当前的热点词汇图&#xff0c;词越大越热门&#xff08;词云图&#xff09; 这里以b站某个评论区的数据为例&#xff0c;爬取63448条数据生成这样的图片 让我们能够更加直观的看到当前的热点 git地址 可以直接使用&#xff0c;中文…

【刷题篇】回溯算法(二)

文章目录 1、求根节点到叶节点数字之和2、二叉树剪枝3、验证二叉搜索树4、二叉搜索树中第K小的元素5、二叉树的所有路径 1、求根节点到叶节点数字之和 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表…

基于ssm的四六级在线考试系统(java源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的四六级在线考试系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 四六级在线考试系统的主要使…

OpenHarmony应用集成和固件集成中C库差异化分析

背景 OpenHarmony中&#xff0c;三方库的使用有两种方式&#xff1a; 一、固件集成 三方库经由OpenHarmony构建框架编译出的动态库或静态库&#xff0c;打包到rom中 二、应用集成 三方库经由IDE&#xff08;通过IDE中的cmake&#xff09;编译出的动态库或静态库&#xff0…

CH254X 8051芯片手册介绍

1 8051CPU 8051是一种8位元的单芯片微控制器&#xff0c;属于MCS-51单芯片的一种&#xff0c;由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司&#xff0c;所以有很多公司在做以8051为核心的单片机&#xff0c;如Atmel、飞利浦、深联华等公…

MySQL视图的语法以及限制

语法 创建&#xff1a;create view view_name as select 语句; mysql能够通过创建视图的方式来创建一个虚拟表&#xff0c;它内容由select 语句决定。 并且创建的视图的变化会影响到主表&#xff0c;主表的变化也会影响视图。 删除: drop view view_name; 其实我们能够发现&am…

数据结构--链式队列

一.链式队列的设计思想: 首先一定要理解设计的初衷,就是队头队尾的位置要满足怎么快怎么设计.那么分析如下: 最终我们敲定了入队,出队的时间复杂度都为O(1)的一种设计,也就是第四种设计;当然,头节点的数据域不使用,所以我们设计链式队列的头节点的时候删除数据域即可,链式队列…

单列模式1.0

单列模式 单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例 1.饿汉模式 只要程序一启动就会立即创建出一个对象 class Signleton{private static Signleton instancenew Signleton();//防止在以后的代码中再创建对象&#xff0c;我们将构造方法private,…

2024年阿里云优惠券领取和使用方法

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…

LeetCode-416. 分割等和子集【数组 动态规划】

LeetCode-416. 分割等和子集【数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;01背包问题&#xff0c;动规五部曲解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分…

ControllerAdvice用法

ControllerAdvice用法 ControllerAdvice是一个组件注解&#xff0c;它允许你在一个地方处理整个应用程序控制器的异常、绑定数据和预处理请求。这意味着你不需要在每个控制器中重复相同的异常处理代码&#xff0c;从而使得代码更加简洁、易于管理。 主要特性 全局异常处理&a…

CTF之comment

网站的登录框里有提示 账号&#xff1a;zhangwei 密码&#xff1a;zhangwei***&#xff08;后三位要自己猜&#xff09; 用burpsuit抓包爆破发现密码为zhangwei666 进去后就一个留言榜&#xff08;目前没发现怎么用&#xff09; 扫一下网站发现git泄露 1.下载 进入root用户&…