【C++STL基础入门】list的增、删

news2025/2/1 15:50:26

文章目录

  • 前言
  • 一、list迭代器
    • 1.1 list迭代器的定义
  • 二、list增
    • 2.1 头添加
    • 2.2 尾添加
    • 2.3 中间添加
  • 三、list删
    • 3.1 尾删除
    • 3.2 头删除
    • 3.3 删除指定元素
    • 3.4 clear()函数
    • 3.5 remove()函数
    • 3.6 unique()函数
  • 总结


前言

在C++中,STL(Standard Template Library)是一个功能强大且常用的程序库,它为我们提供了许多容器和算法,使得编写高效且可维护的代码变得更加容易。其中,list是STL中的一个双向链表容器,它可以在任意位置高效地插入和删除元素。本文将介绍list容器的基本用法,包括如何增加和删除其中的元素。


一、list迭代器

1.1 list迭代器的定义

二、list增

2.1 头添加

1、push_front(const TYPE &val )
功能:将元素 val 插入到list容器的开头。
参数:val - 要插入的元素的值。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_front(10);
    myList.push_front(5);

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:5 10

    return 0;
}

在这里插入图片描述

2.2 尾添加

2、void push_back( const TYPE &val );
功能:将元素 val 插入到list容器的末尾。
参数:val - 要插入的元素的值。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(5);

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 5

    return 0;
}

在这里插入图片描述

2.3 中间添加

1、iterator insert( iterator loc, const TYPE &val );
功能:将元素 val 插入到迭代器 loc 所指示的位置之前。
参数:loc - 指向插入位置的迭代器;val - 要插入的元素的值。
返回值:指向插入的元素的迭代器。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.insert(it, 15); // 在第二个元素之前插入15

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 15 20 30

    return 0;
}

在这里插入图片描述

2、void insert( iterator loc, size_type num, const TYPE &val );

功能:将 num 个值为 val 的元素插入到迭代器 loc 所指示的位置之前。
参数:loc - 指向插入位置的迭代器;num - 要插入的元素的数量;val - 要插入的元素的值。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.insert(it, 2, 15); // 在第二个元素之前插入两个值为15的元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 15 15 20 30

    return 0;
}

在这里插入图片描述

3、void insert( iterator loc, input_iterator start, input_iterator end );
功能:将范围 [start, end) 的元素插入到迭代器 loc 所指示的位置之前。
参数:loc - 指向插入位置的迭代器;start 和 end - 定义要插入范围的迭代器。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>
#include <vector>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    std::vector<int> myVector{5, 15};
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.insert(it, myVector.begin(), myVector.end()); // 在第二个元素之前插入myVector的元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 5 15 20 30

    return 0;
}

在这里插入图片描述

三、list删

3.1 尾删除

1、void pop_back();
功能:从list容器的末尾删除一个元素。
参数:无参数。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    myList.pop_back(); // 删除末尾元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 20

    return 0;
}

在这里插入图片描述

3.2 头删除

1、pop_front()
功能:从list容器的开头删除一个元素。
参数:无参数。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    myList.pop_front(); // 删除开头元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:20 30

    return 0;
}

在这里插入图片描述

3.3 删除指定元素

1、 iterator erase( iterator loc );
功能:删除迭代器 loc 所指示的元素。
参数:loc - 指向要删除元素的迭代器。
返回值:指向被删除元素之后位置的迭代器。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    auto it = myList.begin(); // 指向第一个元素的迭代器
    ++it; // 指向第二个元素的迭代器
    myList.erase(it); // 删除第二个元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 30

    return 0;
}

在这里插入图片描述

2、 iterator erase( iterator start, iterator end );
功能:删除位于范围 [start, end) 内的元素。
参数:start 和 end - 定义要删除范围的迭代器。
返回值:指向被删除元素后位置的迭代器。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    auto start = myList.begin(); // 指向第一个元素的迭代器
    auto end = myList.end(); // 结束迭代器
    myList.erase(start, end); // 删除所有元素
    
    std::cout << "List size after erase: " << myList.size() << std::endl;
    // 输出:List size after erase: 0

    return 0;
}

在这里插入图片描述

3.4 clear()函数

1、clear()
功能:清空list容器,删除所有元素。
参数:无参数。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    
    myList.clear(); // 清空list

    std::cout << "List size after clear: " << myList.size() << std::endl;
    // 输出:List size after clear: 0

    return 0;
}

在这里插入图片描述

3.5 remove()函数

1、void remove( const TYPE &val );
功能:从list容器中删除所有与指定值 val 相等的元素。
参数:val - 要删除的元素的值。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(30);
    myList.push_back(20);
    
    myList.remove(20); // 删除所有值为20的元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 30

    return 0;
}

在这里插入图片描述

3.6 unique()函数

1、unique()
功能:从list容器中删除所有连续重复的元素,只保留一个副本。
参数:无参数。
返回值:无返回值。
示例代码:

#include <list>
#include <iostream>

int main() {
    std::list<int> myList;
    myList.push_back(10);
    myList.push_back(20);
    myList.push_back(20);
    myList.push_back(30);
    myList.push_back(30);
    myList.push_back(30);

    myList.unique(); // 删除连续重复的元素

    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    // 输出:10 20 30

    return 0;
}

在这里插入图片描述


总结

本文介绍了如何使用C++STL中的list容器进行元素的增加和删除。通过使用push_back()和push_front()函数,我们可以向list容器的末尾和开头添加元素;而使用pop_back()和pop_front()函数,可以从list容器的末尾和开头删除元素。list容器的特点是可以高效地在任意位置进行插入和删除操作,适用于需要频繁修改容器的场景。希望本文能够帮助你入门使用list容器,并进一步了解C++STL的强大功能。

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

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

相关文章

ALBERT-更小更少但并不快

BERT模型的压缩大致可以分为&#xff1a;1. 参数剪枝&#xff1b;2. 知识蒸馏&#xff1b;3. 参数共享&#xff1b;4. 低秩分解。 其中&#xff0c;对于剪枝&#xff0c;比较简单&#xff0c;但是容易误操作降低精读&#xff1b; 对于知识蒸馏&#xff0c;之前我写个一系列的…

【完美世界】战王之殇特别篇定档,11月3日播,云曦受辱石昊杀红眼了

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析完美世界国漫资讯。 完美世界第132集已经播出了&#xff0c;相信很多人都去看了。但是不知道大家注意到这一集的片尾没有。如果没有快进或者直接跳过的话&#xff0c;那么应该知道&#xff0c;官方给大家送惊喜了。 这个…

高校教务系统登录页面JS分析——四川大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

进程同步互斥问题

互斥-临界区前后分别PV操作&#xff1b;同步-前V后P 一、生产者费者问题 1.过程&#xff1a; 生产者生产产品——>缓冲区(供两者共享使用)——>消费者取出产品使用&#xff1b;但缓冲区有容量要求&#xff0c;会导致等待与唤醒。缓冲区是临界资源&#xff0c;各进程必…

Jetpack:007-各种各样的Button

文章目录 1. 概念介绍2. 使用方法2.1 Button2.2 IconButton2.3 ElevatedButton2.4 OutlinedButton2.5 TextButton2.6 FloatingActionButton 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中输入框相关的内容&#xff0c;本章回中将要介绍 Button。闲话休提&#xff0…

Linux系统编程02

makefile的原理 问题需求 之前我们讲过C语言代码主要是经过编译和链接两个步骤生成目标文件&#xff0c;但是在编译的时候我们可能需要进行多条指令的输入&#xff0c;要对main函数所在的文件进行汇编&#xff0c;再将我们定义的函数文件进行汇编&#xff0c;分别形成*.o文件&a…

网课、会议投屏自动截屏软件推荐 —— 使用定时自动截屏软件,自动截屏网课、会议投屏,方便回顾、整理

在当前的远程学习和工作环境下&#xff0c;我们经常需要参加网课和会议&#xff0c;而这些内容通常都是通过投屏的方式呈现给我们的。为了更好地记录和回顾这些内容&#xff0c;我们可以使用定时截屏软件来保存这些投屏截屏。 定时截屏软件功能 定时截屏软件可以帮助我们定时…

ModSecurity开源WAF防火墙和控制面板安装教程

ModSecurity开源WAF防火墙和控制面板安装教程 CyberPanel带有两个版本&#xff0c;一个是CyberPanel&#xff0c;另一个是CyberPanel Ent。CyberPanel附带OpenLiteSpeed&#xff0c;不限数量域名完全免费。CyberPanel Ent附带LiteSpeed Web Server Enterprise&#xff0c;只免…

2023年中国门把手产量、销量及市场规模分析[图]

门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种&#xff0c;用于开启和关闭门窗&#xff0c;同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着消…

leetCode 72. 编辑距离 动态规划 + 滚动数组 + 优化空间

72. 编辑距离 - 力扣&#xff08;LeetCode&#xff09; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 编辑距离的应用场景&#xff1a;…

200多万开发者才开发91款应用,国产手机操作系统离开安卓活不了?

随着某国产手机操作系统强调将不再兼容安卓&#xff0c;他们沸腾了&#xff0c;表示将真正独立自主发展&#xff0c;然而业界人士却指出号称拥有220万开发者的该款操作系统至今仅开发了91款应用&#xff0c;彻底撕下了它的遮羞布。 应用对一个智能操作系统有多重要&#xff0c;…

Go 代码块与作用域,变量遮蔽问题详解

Go 代码块与作用域详解 文章目录 Go 代码块与作用域详解一、引入二、代码块 (Block)2.1 代码块介绍2.2 显式代码块2.3 隐式代码块2.4 空代码块2.5 支持嵌套代码块 三、作用域 (Scope)3.1 作用域介绍3.2 作用域划定原则3.3 标识符的作用域范围3.3.1 预定义标识符作用域3.3.2 包代…

互联网Java工程师面试题·Java 并发编程篇·第八弹

目录 33、Java 死锁以及如何避免&#xff1f; 34、死锁的原因 35、怎么唤醒一个阻塞的线程 36、不可变对象对多线程有什么帮助 37、什么是多线程的上下文切换 38、如果你提交任务时&#xff0c;线程池队列已满&#xff0c;这时会发生什么这里区分一下&#xff1a; 39、J…

探索JDK8新特性,Stream 流:构建流的多种方式

当我们处理集合数据时&#xff0c;往往需要对其进行各种操作&#xff0c;如过滤、映射、排序、归约等。在 Java 8 中引入的 Stream 流为我们提供了一种更加简洁和灵活的方式来处理数据。上述情况都是流对集合进行操作的&#xff0c;但是对于流的创建操作还是不太了解&#xff0…

解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么需要happens-before原则&#xff1a; 主要是因为Java内存模型 &#xff0c; 为了提高CPU效率&#xff0c;通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…

docker保存镜像出错

报错&#xff1a;open .docker_temp_801673807: Access is denied. 查询后发现是因为C盘权限问题导致失败&#xff0c;修改保存路径&#xff1a;docker save -o D:\nginx.tar nginx:latest后成功。

解决docker使用pandarallel报错OSError: [Errno 28] No space left on device

参考&#xff1a;https://github.com/nalepae/pandarallel/issues/127 在使用pandarallel报错OSError: [Errno 28] No space left on device&#xff0c;根据上述issue发现确实默认使用的MEMORY_FS_ROOT为 /dev/shm&#xff0c;而在docker环境下这个目录大小只有64M&#xff0…

​嵌入式VS纯软件

嵌入式VS纯软件 嵌入式系统开发与纯软件开发之间存在关键差异&#xff0c;涵盖了硬件依赖性、资源限制、实时性要求、安全性和维护等多个方面。最近很多小伙伴找我&#xff0c;说想要一些嵌入式资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#x…

序列中排列存在类dp问题+结合组合数学和拆贡献:1014T4

http://47.92.197.167:5283/contest/412/problem/4 赛时就想到枚举开头来拆贡献。 先说一下&#xff0c;对于A我们不关心具体的值&#xff0c;我们只关心哪些位置相等&#xff0c;哪些位置不等&#xff0c;最后乘上一个系数就行 然后对于序列是否存在排列类问题有个常见的dp套…

【API篇】二、源算子API

文章目录 0、demo数据1、源算子Source2、从集合中读取数据3、从文件中读取4、从Socket读取5、从Kafka读取6、从数据生成器读取数据7、Flink支持的数据类型8、Flink的类型提示&#xff08;Type Hints&#xff09; 0、demo数据 准备一个实体类WaterSensor&#xff1a; Data All…