【STL】C++ list 基本使用

目录

一 list 常见构造

1 空容器构造函数(默认构造函数)

2 Fill 构造函数

3 Range 构造函数

4 拷贝构造函数

二 list迭代器

1 begin && end

2 rbegin && rend

三 list 容量操作

四 list 修改操作

1 assign 

2  push_front && pop_back

3 push_back && pop_back

4  insert

5 erase

6 swap

7. resize

8 clear

9 关于 emplace系列操作说明

五 list 元素访问

六 其他操作

1 splice

2 remove

3 unique

4 sort

5  reverse 

七 总结 


一 list 常见构造

1 空容器构造函数(默认构造函数)

构造一个没有元素的空容器。

2 Fill 构造函数

构造一个包含 n 个元素的容器。每个元素都是 val 的副本。

3 Range 构造函数

构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该范围中的相应元素构造而成。

4 拷贝构造函数

构造一个容器,其中包含 x 中每个元素的副本,顺序相同。

#include<iostream>
#include<list>
using namespace std;void Print(list<int>& lt)
{list<int>:: iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;
}int main()
{list<int> a;list<int> b(4, 100);list<int> c(4);list<int> d(b.begin(), b.end());list<int> e(b);cout << "b: ";Print(b);cout << "c: ";Print(c);cout << "d: ";Print(d);cout << "e: ";Print(e);return 0;
}

C++11构造

void Print(list<int>& lt)
{list<int>:: iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;
}int main()
{list<int> lt1{ 1, 2, 3, 4, 5 };Print(lt1);return 0;
}

 

二 list迭代器

list模式和vector如出一辙

注意:

ist的迭代器是支持++--操作的(前后缀都支持)
但是不支持+-操作,因为链表不能进行随机访问操作,只能O(n)查询

1 begin && end

iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
void Test3()
{list<int> lt(4, 1);list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << ' ';++it;}cout << endl;const list<int> llt(4, 10);list<int>::const_iterator itt = llt.begin();while (itt != llt.end()){cout << *itt << ' ';++itt;}}

2 rbegin && rend

reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
void Test4()
{list<int> lt(5);list<int>::reverse_iterator it = lt.rbegin();int i = 1;while (it != lt.rend()){*it += i;++it;++i;}for (auto e : lt){cout << e << ' ';}}

三 list 容量操作

 这里直接代码演示

void Test5()
{list<int> lt1;if (lt1.empty()) cout << "empty" << endl;else cout << "full" << endl;list<int> lt2{ 1, 2, 3, 4 };cout << "lt1: " << lt1.size() << "  lt2: " << lt2.size() << endl;
}

四 list 修改操作

1 assign 

将新内容分配给 list 容器,替换其当前内容,并相应地修改其大小。

range (1)	
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
fill (2)	
void assign (size_type n, const value_type& val);
void Test6()
{std::list<int> first;std::list<int> second;first.assign(7, 100);                      second.assign(first.begin(), first.end()); int myints[] = {1776,7,4 };first.assign(myints, myints + 3);            cout << "first: ";for (auto e : first){cout << e << " ";}cout << endl;cout << "second: ";for (auto e : second){cout << e << " ";}cout << endl;
}

2  push_front && pop_back

void push_front (const value_type& val);
void pop_front();
void Test7()
{list<int> lt = { 1, 2 };lt.push_front(100);for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;
}

3 push_back && pop_back

void push_back (const value_type& val);
void pop_back();
void Test8()
{list<int> lt = { 1, 2 };lt.push_back(100);for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;
}

4  insert

指定位置的元素之前插入新元素来扩展容器,从而有效地通过插入的元素数增加容器大小

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);
void Test9()
{list<int> lt(4, 10);lt.insert(lt.begin(), 100);for (auto e : lt){cout << e << ' ';}cout << endl;lt.insert(lt.end(), 4, 100);for (auto e : lt){cout << e << ' ';}cout << endl;}

5 erase

从容器中删除单个元素 (position) 或一系列元素 ( [first,last))

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
void Test10()
{list<int> lt{ 1, 2, 3, 4, 5, 6};lt.erase(lt.begin());for (auto e : lt){cout << e << ' ';}cout << endl;lt.erase(++lt.begin(), lt.end());for (auto e : lt){cout << e << ' ';}
}

6 swap

 通过 x 的内容交换容器的内容,x 是另一个相同类型的容器对象。size可能有所不同。

void swap (list& x);
void Test11()
{list<int> l1(4, 10);list<int> l2(4, 1);l1.swap(l2);cout << "l1: ";for (auto e : l1){cout << e << ' ';}cout << endl;cout << "l2: ";for (auto e : l2){cout << e << ' ';}  
}

7. resize

调整容器的大小,使其包含 n 个元素。

void resize (size_type n);
void resize (size_type n, const value_type& val);

如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出(并销毁它们)的元素。

如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。

如果指定了 val,则新元素将初始化为 val 的副本,否则,它们将进行值初始化(0)。

void Test12()
{list<int> mylist;for (int i = 1; i < 10; ++i) mylist.push_back(i);mylist.resize(5);cout << "mylist contains:";for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)std::cout << ' ' << *it;cout << endl;mylist.resize(8, 100);cout << "mylist contains:";for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)std::cout << ' ' << *it;cout << endl;mylist.resize(12);cout << "mylist contains:";for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)std::cout << ' ' << *it;cout << endl;}

8 clear

 从容器中删除所有元素(这些元素被销毁),使容器的大小为0。

void clear() noexcept;
void Test13()
{list<int> lt(1, 4);lt.clear();cout << lt.size() << endl;for (auto e : lt){cout << e << ' ';}cout << endl;
}

9 关于 emplace系列操作说明

这个系列的操作放在 右值引用讲解完之后再讲, 这样才能更好的理解. 大家不需要着急的, 因为 上面讲的完全够用, 而且emplace 是优化, 并不是其他功能

五 list 元素访问

 

void Test13()
{list<int> lt{ 1, 2, 3, 4 };cout << lt.front() << endl;cout << lt.back() << endl;
}

六 其他操作

1 splice

将元素从一个列表转移到另一个列表

void splice(iterator position, list& x);
将 x 的所有元素转移到容器中void splice(iterator position, list& x, iterator i);
仅将 i 指向的元素从 x 传输到容器中void splice(iterator position, list& x, iterator first, iterator last);
将范围 [first,last) 从 x 传输到容器中。
void Test14()
{list<int> mylist1 = { 1, 2, 3, 4 }, mylist2 = { 10, 20, 30 };list<int>::iterator it = mylist1.begin();++it;         // points to 2mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4cout << "mylist1:  ";for (auto e : mylist1){cout << e << " ";}cout << endl;cout << "mylist2:  ";for (auto e : mylist2){cout << e << " ";}cout << endl;mylist2.splice(mylist2.begin(), mylist1, mylist1.begin());cout << "mylist1:  ";for (auto e : mylist1){cout << e << " ";}cout << endl;cout << "mylist2:  ";for (auto e : mylist2){cout << e << " ";}cout << endl;mylist1.splice(mylist1.begin(), mylist2, mylist2.begin(), mylist2.end());cout << "mylist1:  ";for (auto e : mylist1){cout << e << " ";}cout << endl;cout << "mylist2:  ";for (auto e : mylist2){cout << e << " ";}cout << endl;
}

2 remove

从容器中删除所有与 val相等的元素。这将调用这些对象的析构函数,并通过删除的元素数来减小容器大小。

vvoid remove (const value_type& val);
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(5);cout << lt.size() << endl;lt.remove(2);for (auto e : lt){cout << e << " ";}cout << endl;cout << lt.size() << endl;return 0;
}

3 unique

从容器中每个连续的相等元素组中删除除第一个元素之外的所有元素。请注意,只有当某个元素与其前面的元素相等时,该元素才会从列表容器中删除。因此,此函数对于排序列表特别有用。

void unique();
int main()
{list<int> lt;lt.push_back(1);lt.push_back(1);lt.push_back(2);lt.push_back(4);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(3);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();//需要先排序lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

4 sort

对容器中的元素进行排序

对列表 中的元素进行排序,改变它们在容器中的位置。

void sort();
void Test15()
{list<int> lt{ 2, 1, 2, 4, 10, 11, 99, 88 };lt.sort();for (auto e : lt){cout << e << " ";}}

5  reverse 

反转列表容器 中元素的顺序

void reverse()void reverse()
int main()
{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.reverse();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

七 总结 

list终于抽时间写完了, 首先本节大多数代码实验, 理论讲解少, 还是那句话, 如果对概念不清楚, 请到 string看, 或者翻阅文档, 这些都是最基本的素养.  list 很多操作和 vector一样的, 但也有差别, 注意区分即可.

今天去中医看病, 医生说 眼睛就是你的肾, 舌头是你的心脏, 大家一定注意饮食规律, 不要久坐啊.

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

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

相关文章

【LaTex】11 ACM参考文献顺序引用 - 解决 ACM-Reference-Format 顺序不符合论文实际引用顺序的问题

【LaTex】11 ACM参考文献顺序引用 写在最前面解决 ACM-Reference-Format 顺序不符合论文实际引用顺序的问题问题描述问题原因如何解决问题解决方案1&#xff08;更简单&#xff09;解决方案2&#xff08;更自由&#xff09; 小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 …

Python代码:二十一、增加派对名单(二)

1、题目 描述 为庆祝驼瑞驰在牛爱网找到合适的对象&#xff0c;驼瑞驰通过输入的多个连续字符串创建了一个列表作为派对邀请名单&#xff0c;在检查的时候发现少了他最好的朋友“Allen”的名字&#xff0c;因为是最好的朋友&#xff0c;他想让这个名字出现在邀请列表的最前面…

移动云服务器选购指南(图文教程详解)

目录 一、前言 二、基本概念 2.1 定义 2.2 部署形式 2.3 用处 三、主流平台 四、主流产品推荐 4.1 云电脑 4.2 云主机ECS 4.3 弹性公网 IP 五、选购指南 5.1 明确场景 5.2 明确需求 5.3 明确身份 新用户 老用户 5.4 明确时间 5.5 明确教程 六、总结 一、前言…

Aws EC2 + Aws Cli + Terraform

1 什么是 Terraform&#xff1f; Terraform 是由 HashiCorp 创建的“基础架构即代码”(Infrastructure-as-Code&#xff0c;IaC)开源工具。Terraform 的配置语言是 HashiCorp Configuration Language&#xff08;HCL&#xff09;&#xff0c;用来替代更加冗长的 JSON 和 XML 等…

Python魔法之旅-魔法方法(01)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Dolphinscheduler不重启加载Oracle驱动

转载自刘茫茫看山 问题背景 某天我们的租户反馈数据库连接缺少必要的驱动&#xff0c;我们通过日志查看确实是缺少部分数据库的驱动&#xff0c;因为DolphinScheduler默认只带了Oracle和MySQL的驱动&#xff0c;并且需要将pom文件中的test模式去掉才可以在打包的时候引入。我…

Prompt Engineering

https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/ Few-shot: 有例子&#xff0c;效果好&#xff1b;增大了context长度&#xff0c;执行变慢&#xff1b; 可能的问题&#xff1a;1. Label不均衡造成生成label的bias&#xff1b;2.最后一个shot的label容易…

前端面试问题:子组件的某一个方法调用执行逻辑由父组件的属性状态变化来决定

面试官&#xff1a;请你讲讲你在该项目中遇到的问题是什么&#xff1f;你怎么解决这个问题&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路…

强化学习——学习笔记2

在上一篇文章中对强化学习进行了基本的概述&#xff0c;在此篇文章中将继续深入强化学习的相关知识。 一、什么是DP、MC、TD&#xff1f; 动态规划法&#xff08;DP&#xff09;&#xff1a;动态规划法离不开一个关键词&#xff0c;拆分 &#xff0c;就是把求解的问题分解成若…

解读:Mint Blockchain 最新路线图,释放 NFT 生态重磅发展计划

作者&#xff1a;Mint Ecosystem 关于 Mint Blockchain&#xff1a;Mint Blockchain 是一个以太坊原生 L2 网络&#xff0c;核心是发展 NFT 生态和产业&#xff0c;促进 NFT 领域的 Mass Adoption 产生。MintCore 团队致力于将 Mint Blockchain 打造成一个围绕服务 NFT 资产的…

GIT 新建分支和合并分支

文章目录 前言一、新建分支二、切回老分支&#xff0c;保留新分支的更改三、合并分支 前言 本文主要针对以下场景进行介绍&#xff1a; 场景一&#xff1a;创建新的分支 当前分支(dev_1)已经开发完毕&#xff0c;下一期的需求需要在新分支(dev_2)上进行开发&#xff0c;如何创…

Java整合EasyExcel实战——2 导出复杂表头

详情代码 实体类 Data public class ComplexHeadData {ExcelProperty({"主标题", "字符串标题"})private String string;ExcelProperty({"主标题", "日期标题"})private Date date;ExcelProperty({"主标题", "数字标…

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程&#xff1a;Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡&#xff08;主关卡&#xff09; 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立&#xff0c;官方教程分为了两…

“揭秘:为什么羊驼Ollama成为计算机运行大型语言模型的最佳拍档?“

最近&#xff0c;AIM 评测了在计算机上本地运行大语言模型&#xff08;LLM&#xff09;的最佳工具&#xff0c;Ollama 脱颖而出&#xff0c;成为最高效的解决方案&#xff0c;提供了无与伦比的灵活性。Ollama 是 Jeffrey Morgan 开发的一款开源工具&#xff0c;它正在彻底改变爱…

Prometheus Operator创建告警规则并接入钉钉报警

prometheus之钉钉报警 前言1. 添加prometheus报警规则1.2 添加自定义报警规则文件 2. 配置钉钉报警2.2 部署dingding插件 3. 编写alertmanager配置文件 前言 在kubenetes上安装了kube-promethues&#xff08;包含Prometheus Operator&#xff09;,程序正常跑起来了&#xff0c…

expect自动交互

在执行命令或脚本的时候&#xff0c;当控制台提示我们需要输入账号密码、参数等信息的时候&#xff0c;expect可以将预设的参数值自动输入到控制台&#xff0c;实现了自动交互。 1. 安装expect yum install expect 2. 案例&#xff1a; 创建 demo.exp 文件&#xff0c;并添…

BEVFusion的相机工作流中,图像编码之后FPN+ADP网络的作用

在BEVFusion的相机工作流中&#xff0c;图像编码之后会经过一个FPNADP的网络,那么这个结构的作用是什么呢 FPN大家都很熟悉&#xff0c;就是特征金字塔。但是这里还是贴一些来自GPT的废话 在Bird’s Eye View (BEV) 算法中使用的特征金字塔网络&#xff08;FPN, Feature Pyrami…

C++容器之栈(std::stack)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 empty3.3 size3.4 top3.5 push3.6 emplace3.7 pop3.8 swap1 概述 堆栈是一种容器适配器,专门设计用于在后进先出(后进先出)环境中操作,其中元素仅从容器的一端插入和提取。   堆栈被实现为容器适配器,容器适配器是使用…

再创佳绩丨达梦数据库一体机荣获2024数字中国创新大赛·信创赛道总决赛一等奖

5月24日&#xff0c;第七届数字中国建设峰会在福州盛大开幕&#xff0c;峰会内容安排包含开幕式、主论坛、分论坛、数字中国创新大赛、现场体验区及成果发布和专业工作会议等。武汉达梦数据库股份有限公司(以下简称达梦数据)受邀参加并在展、会、赛等多个环节深度参与。达梦全栈…

在winnas中使用docker desktop遇到的问题及解决方法记录

最近在尝试从群晖转向winnas&#xff0c;一些简单的服务依然计划使用docker来部署。群晖的docker简单易用且稳定&#xff0c;在win上使用docker desktop过程中遇到了不少问题&#xff0c;在此记录一下以供后来人参考。 一、安装docker desktop后启动时遇到无法启动docker引擎 …