C++STL之List容器

2023-11-01

C++STL之List容器

1.再谈链表

List链表的概念再度出现了,作为线性表的一员,C++的STL提供了快速进行构建的方法,为此,在前文的基础上通过STL进行直接使用,这对于程序设计中快速构建原型是相当有必要的,这里的STL链表是单链表的形式。与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件

2.头文件

头文件:#include

3.初始化

格式为:explicit list (const allocator_type& alloc = allocator_type());

我们以int类型作为参数为例进行创建,其创建方法与vector无异

list<int> l1;           //创建一个空链表
  list<int> l2(10);       //创建一个链表其有10个空元素
  list<int> l3(5,20);     //创建一个链表其有5个元素内容为20
  list<int> l4(l3.begin(),l3.end());  //创建一个链表其内容为l3的内容
  list<int> l5(l4);               //创建一个链表其内容为l4的内容

4. 迭代器

遍历代码举例(其方法和vector版本无异只是更加精简):

list<int> li;
for(list<int>::iterator it=li.begin();it!=li.end();it++){
        cout<<*it<<' ';
    }

5. 常用接口

我们使用list li;预先创建了一个链表,命名为li,方便举例

a. 判断是否为空empty()

返回一个bool类型的值,只存在真和假,当链表为空时为真,不为空时为假

函数原型

bool empty() const;

if(li.empty()){     //当链表为空的时候执行
        cout<<"is empty()"<<endl;
    }else{
        cout<<"not empty()"<<endl;
    }

b. 获取大小size()

返回链表元素的个数

函数原型

size_type size() const;

cout<<li.size()<<endl;

c. 链表前插入push_front() &&删除 pop_front()

push_front()表示在链表最前端插入一个数据,pop_front()表示在链表最前端删除一个数据。

函数原型

void push_front (const value_type& val);

void pop_front();

li.push_front(10);
li.pop_front();

d. 链表后插入push_back() &&删除 pop_back()

push_back()表示在链表尾插入一个数据,pop_back()表示将链表尾删除一个数据。

函数原型:

void push_back (const value_type& val);

void pop_back();

li.push_back(10);
    li.pop_back();

e. 插入insert()

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

函数原型:

插入单一数据到指定位置:

iterator insert (iterator position, const value_type& val);

插入一段数据到指定位置:

void insert (iterator position, size_type n, const value_type& val);

插入一段别的容器的数据到指定位置:

template

void insert (iterator position, InputIterator first, InputIterator last);

使用举例:

	li.insert(li.begin(),10);     //在链表最前端插入数据10
    li.insert(li.begin(),5,20);   //在链表最前端插入5个数据内容为20
  
    list<int> k(2,50);   //创建一个新的链表k,其拥有2个元素内容均为50
    li.insert(li.begin(),li.begin(),li.end());  //在链表v最前端插入链表上K的全部内容

f. 删除erase()

删除一个元素,或者是一段区间的元素,将会自动缩减空间使用。

函数原型:

iterator erase (iterator position);

iterator erase (iterator first, iterator last);

使用举例

li.erase(li.begin());     //删除第一个元素
li.erase(li.begin(),li.begin()+4); //删除前4个元素

g. 排序sort()

让整个链表变成升序状态,或者变成自定义的排序状态

函数原型:

void sort();

template    void sort (Compare comp);

详细举例:

#include<iostream>
#include<list>
using namespace std;

int cmp(const int &a,const int &b){ 
    //简单的自定义降序序列
    return a>b;
}

int main(){
    list<int> li;           //创建一个空链表
    for(int i=10;i>=6;i--){
        li.push_back(i);
    }

    li.push_front(3);
    li.push_back(20);

    list<int> li2(li);
    for(list<int>::iterator it=li.begin();it!=li.end();it++){
        cout<<*it<<' ';
    }
    cout<<endl;

//排序前3 10 9 8 7 6 20//
    li.sort();
  
    for(list<int>::iterator it=li.begin();it!=li.end();it++){
        cout<<*it<<' ';
    }
    cout<<endl;
//默认排序后 3 6 7 8 9 10 20//

    li2.sort(cmp);
    for(list<int>::iterator it=li2.begin();it!=li2.end();it++){
        cout<<*it<<' ';
    }
    cout<<endl;
//自定义排序后 20 10 9 8 7 6 3//
    return 0;
}

h. 逆序reverse()

相对于自定义的降序方法,STL提供了一个默认的降序方法reverse(),类似于sort一样直接使用即可。

void reverse();

li.reverse();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++STL之List容器 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 私有模板函数

    我有一堂课 C h class C private template
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • Linux驱动之系统移植----uboot移植(有设备树版本),完整移植.

    uboot版本 uboot2020 04 开发板 100ask imx6ull pro 拿到官方uboot后第一步先编译烧写测试 查看哪些驱动可用 哪些不可用 根据开发板厂商提供的资料 使用mx6ull 14x14 evk defconfi
  • 屏幕显示质量的直接影响因素及其在编程中的应用

    屏幕显示质量对于用户体验和视觉效果至关重要 在编程中 我们可以通过一些技术手段来提高屏幕显示的清晰度和质量 本文将介绍一些直接影响屏幕显示清晰度的因素 并提供与之相关的编程示例 分辨率 屏幕分辨率是指屏幕上像素点的数量 通常用水平像素数乘以
  • vue 3.x基础入门:vue 的指令与过滤器

    前置基础知识 Vue3 0入门 基本使用以及vue的调试工具 文章目录 一 vue的指令与过滤器 1 1 指令的概念 1 2 内容渲染指令 v text 语法 v html 1 3 属性绑定指令 属性绑定指令的简写形式 使用 Javascr
  • 虚幻引擎5 (UE5):完整的初学者学习教程

    流派 电子学习 MP4 视频 h264 1280 720 音频 AAC 44 1 KHz 语言 英语 中英文字幕 根据原英文字幕机译更准确 大小解压后 6 26 GB 时长 7h 32m 虚幻引擎5的最快入门方法云桥网络 平台获取教程 你会
  • 关于BeautifulSoup的总结

    最近一直在用BeautifulSoup 但是语法很容易忘记 在这里做个学习总结吧 参考 Beautiful Soup 4 2 0 文档 功能 BeautifulSoup是用来从HTML或XML中提取数据的Python库 导入 使用方法 fr
  • Spring搭建Web应用(MVC)起步(Tomcat环境)

    Spring搭建Web应用 MVC 起步 Tomcat环境 转载 首先 建立WEB应用的目录 必须的 在tomcat的webapp目录下 创建目录 spring 目录结构如下 spring WEB INF classes lib 然
  • 视频画面噪点太多难处理?AI工具一键消除

    很多时候我们下载或者录制的视频画面都会有带噪点的问题 噪点就像密密麻麻的小颗粒 这样非常影响观看 这个时候我们需要使用视频降噪功能 视频降噪可以提升视频内容的保真 那么视频画面噪点如何处理呢 视频噪点 也称为视频噪声 是指由于各种原因导致的
  • 一个开发日常error: #20: identifier “SPI_HandleTypeDef“ is undefined

    最近开发跑rtos带蓝牙的stm32wb55 开发st的方便在于有cube可以生成代码 可是有中间层的情况就支持的不够好 比如既带rtos又带蓝牙协议栈就无法用cube生成可以编译成功的代码 官方例程的readme的描述也说明了这一点 所以
  • JS年龄、身份证号、出生日期、邮箱、密码、数字、中文等多种方式校验(持续完善中...)

    1 年龄校验 export const validateCheckAge rule value callback gt if value return callback new Error 年龄不能为空 setTimeout gt if N
  • Quartz 环境搭建并启动

    项目代码 https github com yuleiqq quartz example tree master quartz study 1 利用IDEA 工具搭建一个基本的Java Maven 工程 并配置依赖包 pom xml 配置
  • USB-IF BC1.2充电协议解读

    BC1 2是USB2 0开始的一个使用Vbus 5V进行USB对接充电的一个协议 该协议由USB IF协会在2010年10月发布 基于当时USB 2 0的Vbus供电 最大能供给电流为500mA 协议通过USB的D D 完成并确定支持BC1
  • Flask进阶(一)——请求上下文和应用上下文完全解答(上)

    前言 flask的轻便和强大的扩展性能会让web的初级开发者甚至是有经验的开发者神往 flask能在短时间内快速搭建web的后台 而 flask web开发 基于python的web应用开发实战 是最好的flask入门教程了 但当中对应用上
  • Linux如何强制关闭PyCharm或者其他软件

    1 右键选择打开终端 2 输入ps ef指令查询所要关闭程序的PID号 3 找到自己想要关闭的程序 一定看好是自己的 别关了别人的 记住PID号 26252 26257 4 输入 kill s 9 PID号 26252 26257 5 敲上
  • Laravel 添加自定义全局函数

    第一步 在app目录下建立Common文件夹 在文件夹中创建helpers php 第二步 在根目录下的artisan文件中中引入require once DIR app Common helpers php 自动加载 第三步 在publi
  • Android开发:实现APP自动填写注册验证码功能

    http blog csdn net xiong it article details 50997084 前言 此技术的实现原理是 广播接收者 和 内容观察者 利用接收到短信时的系统发出的广播进行短信的读取 并利用正则表达式解析出短信中的验
  • 柔性数组 +结构体中数组名与指针的区别

    柔性数组 一 柔性数组 1 柔性数组的特点 2 柔性数组的使用 3 柔性数组的替代形式 二 结构体中数组名与指针的区别 一 柔性数组 柔性数组是指在结构体中定义一个为指定大小的数组 1 柔性数组的特点 1 在结构体中 柔性数组的前面至少有一
  • WSL2+ubuntu2004+cuda11.8+cudnn8.8开发环境搭建

    文章目录 1 系统环境要求 2 WSL2操作 大多是命令行 2 1 安装wsl 2 2 建议直接将默认版本设置为WSL 2 但可能不做这一步默认也是2 2 3 检查版本或状态信息 2 4 安装Linux子系统 2 5 修改安装位置 2 6
  • Eureka Client Instance status DOWN - SpringCloud Eureka 实例状态为DOWN时如何排查问题

    Eureka Client Instance status DOWN SpringCloud Eureka 实例状态为DOWN时如何排查问题 Eureka Client Instance status DOWN SpringCloud Eu
  • ios 手机浏览器,点击输入框页面会放大

    一个普通的h5静态页面 在ios手机上用浏览器打开 发现每次聚焦输入框的时候整个页面都会放大 解决办法在html的头部meta标签中设置 user scalable no viewport meta 标记 HTML 超文本标记语言 MDN
  • C++STL之List容器

    C STL之List容器 1 再谈链表 List链表的概念再度出现了 作为线性表的一员 C 的STL提供了快速进行构建的方法 为此 在前文的基础上通过STL进行直接使用 这对于程序设计中快速构建原型是相当有必要的 这里的STL链表是单链表的