C++ STL容器:序列式容器-链list,forward_list

news2024/10/6 1:28:42

摘要:

  CC++ STL(Standard Template Library,标准模板库)在C++编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C++程序的开发效率和代码质量。

STL 容器 分为 2 大类 , 分别是“序列式容器” 和“关联式容器 ”。

  • 序列式容器:每个元素都有固定位置,取决于插入时机和地点,其底层为线性序列的数据结构,里面存储的是元素本身。
  • 关联式容器:元素位置取决于特定的排序准则,和插入顺序无关,其里面存储的是< key , value >结构的键值对,在数据检索时比序列式容器效率更高。

  本系列博文将详细介绍C++STL的各种容器的特性优缺点,以及其常用算法方法等。本文介绍的是序列式容器-链list,forward_list。

(开发环境:VScode,C++17)

关键词C++STL数据存储数据类型链表listforward_list

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • list
          • 常用函数:
          • 使用例子:
        • forward_list
          • 常用函数:
          • 使用例子:
      • 推荐阅读

正文:

list

在C++标准模板库(STL)中,list 是一个双向链表容器,它允许在常数时间内从链表的任何位置插入和删除元素。与 vectordeque 相比,list 在内存中的元素不是连续存储的,这意味着它不支持对元素的直接访问(即没有 operator[]),但它提供了在链表中的任何位置进行快速插入和删除的能力。(有需要更深入了解数据结构链的,可看同专栏下数据结构分支)。

常用函数:
  • size():返回链表中元素的数量。
  • empty():检测容器是否为空。
  • begin():返回指向链表第一个元素的迭代器。
  • end():返回指向链表尾后位置的迭代器。
  • push_back():在链表末尾插入一个元素。
  • push_front():在链表开头插入一个元素。
  • pop_back():删除链表末尾一个元素。
  • pop_front():删除链表开头一个元素。
  • insert():在迭代器 pos 指向的位置之前插入元素,并返回指向新插入元素的迭代器。
  • erase():删除迭代器 pos 指向的元素,并返回指向下一个元素的迭代器。
使用例子:
#include <iostream>
#include <list>

int main()
{
    // 创建一个空的 std::list
    std::list<int> myList;

    // 使用 empty 检查列表是否为空
    std::cout << "Is the list empty? " << (myList.empty() ? "Yes" : "No") << std::endl;
  
    // 使用 push_back 在列表末尾添加元素
    myList.push_back(1);
    myList.push_back(2);
    myList.push_back(3);
  
    // 使用 size 获取列表中的元素数量
    std::cout << "Size of the list: " << myList.size() << std::endl;
  
    // 使用 begin 和 end 获取迭代器
    for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
  
    // 使用 push_front 在列表开头添加元素
    myList.push_front(0);
  
    // 使用 insert 在特定位置插入元素
    // 注意:insert 需要一个迭代器作为插入位置,以及要插入的值
    std::list<int>::iterator it_to_insert = myList.begin(); 
    std::advance(it_to_insert, 2); // 假设我们想在第三个位置插入元素
    myList.insert(it_to_insert, 100);

    // 再次打印列表以查看插入效果
    for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用 erase 删除元素
    // 可以通过迭代器删除单个元素,或者通过两个迭代器删除一个范围
    it_to_insert = myList.begin();
    std::advance(it_to_insert, 3); // 假设我们想删除第四个元素
    myList.erase(it_to_insert);
  
    // 打印列表以查看删除效果
    for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}
forward_list

forward_list 是 C++ 标准模板库 (STL) 中的一个容器,它表示一个单向链表。与 list 不同,forward_list 是一种更简单的链表实现,因为它只包含指向前一个元素的链接(对于头元素之外的所有元素),而没有指向后一个元素的链接。

常用函数:
  • size():返回链表中元素的数量。
  • empty():检测容器是否为空。
  • begin():返回指向链表第一个元素的迭代器。
  • end():返回指向链表尾后位置的迭代器。
  • push_front():在链表开头插入一个元素。
  • pop_front():删除链表头部的一个元素。
  • insert_after():在指定位置之后插入一个新元素,并返回一个指向新元素的迭代器。
  • erase_after():删除容器中某个指定位置或区域内的所有元素。
使用例子:
#include <iostream>  
#include <forward_list>  
  
int main()
{
    // 创建一个空的 forward_list
    std::forward_list<int> myList;

    // 使用 push_front 在列表开头添加元素
    myList.push_front(1);
    myList.push_front(2);
    myList.push_front(3);
  
    // 使用 size 获取列表中的元素数量
    std::cout << "Size of the forward_list: " << myList.size() << std::endl;
  
    // 使用 empty 检查列表是否为空
    std::cout << "Is the forward_list empty? " << (myList.empty() ? "Yes" : "No") << std::endl;
  
    // 使用 begin 和 end 获取迭代器
    for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
  
    // 使用 insert_after 在特定位置之后插入元素
    // 注意:forward_list 没有 insert 函数,而是 insert_after
    auto it_to_insert_after = myList.begin();
    std::advance(it_to_insert_after, 1); // 假设我们想在第二个元素之后插入元素
    myList.insert_after(it_to_insert_after, 100);

    // 再次打印列表以查看插入效果
    for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用 erase_after 删除元素
    // 需要先找到要删除的元素的迭代器
    auto it_to_erase = myList.begin();
    std::advance(it_to_erase, 2); // 假设我们想删除第三个元素
    myList.erase_after(it_to_erase);
  
    // 打印列表以查看删除效果
    for (std::forward_list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

推荐阅读

博客主页:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有许多其它有趣的专栏博文)

C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它STL容器使用及对应的数据结构实现)

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

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

相关文章

数据库系统原理 | 查询作业2

整理自博主本科《数据库系统原理》专业课自己完成的实验课查询作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; ​ ​ ———— 本次实验使用到的图形化工具&#xff1a;Heidi…

深入分析SSL/TLS服务器的证书(C/C++代码实现)

SSL&#xff08;Secure Sockets Layer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;是网络安全领域的重要协议&#xff0c;它们在保护网络通信中发挥着至关重要的作用。这些协议通过加密和身份验证机制&#xff0c;确保数据在传输过程中的机密性和完整性…

cs231n作业1——SVM

参考文章&#xff1a;cs231n assignment1——SVM SVM 训练阶段&#xff0c;我们的目的是为了得到合适的 &#x1d44a; 和 &#x1d44f; &#xff0c;为实现这一目的&#xff0c;我们需要引进损失函数&#xff0c;然后再通过梯度下降来训练模型。 def svm_loss_naive(W, …

python基础篇(8):异常处理

在Python编程中&#xff0c;异常是程序运行时发生的错误&#xff0c;它会中断程序的正常执行流程。异常处理机制使得程序能够捕获这些错误&#xff0c;并进行适当的处理&#xff0c;从而避免程序崩溃。 1 错误类型 代码的错误一般会有语法错误和异常错误两种&#xff0c;语法错…

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…

nginx相关概念(反向代理、负载均衡)

1 Nginx 是什么 Nginx是一款轻量级的Web 服务器&#xff0c;其特点是占有内存少&#xff0c;并发能力强 2 Nginx 反向代理 正向代理代替客户端去发送请求反向代理代替服务端接受请求 2.1 正向代理 若客户端无法直接访问到目标服务器 server 则客户端需要配置代理服务器 pr…

云渲染技术对电影24帧和游戏60帧渲染需求及时间效率的影响

随着云计算技术的飞速发展&#xff0c;云渲染正重塑着影视和游戏产业的制作流程。它如何影响传统电影24帧和现代游戏60帧的渲染需求与时间效率&#xff1f;本文将深入探讨云渲染带来的变革。 一、电影24帧和游戏60帧作用 电影通常以24帧每秒&#xff08;fps&#xff09;的标准…

数字化精益生产系统--IFS财务管理系统

IFS财务管理系统是一款功能丰富、高效且灵活的企业财务管理软件&#xff0c;广泛应用于多个行业和不同规模的企业中。以下是对IFS财务管理系统的功能设计&#xff1a;

Linux shell编程学习笔记63:free命令 获取内存使用信息

0 前言 在系统安全检查中&#xff0c;内存使用情况也是一块可以关注的内容。Linux提供了多个获取内存信息的命令很多。今天我们先研究free命令。 1 free命令的功能、用法和选项说明 1.1 free命令的功能 free 命令可以显示系统内存的使用情况&#xff0c;包括物理内存、交换…

SSM高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…

入门PHP就来我这(高级)11 ~ MySQL

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 PHP操作MySQL数据库的方法 PHP操作数据库现在用的多的是mysqli拓展库&#xff0c;mysqli扩…

【Python机器学习】模型评估与改进——多分类指标

多分类问题的所有指标基本是上都来自于二分类问题&#xff0c;但是要对所有类别进行平均。多分类的精度被定义为正确分类的样本所占的比例。同样&#xff0c;如果类别是不平衡的&#xff0c;精度并不是很好的评估度量。 想象一个三分类问题&#xff0c;其中85%的数据点属于类别…

可视化作品集(07):网格化管理领域

网格化管理可视化大屏是指利用大屏幕显示设备&#xff0c;通过数据可视化的方式展示网格化管理的相关信息和指标。网格化管理是一种以网格为基础的城市管理模式&#xff0c;通过将城市划分为不同的网格单元&#xff0c;实现对城市各项管理工作的全覆盖、全时空监控和全过程管理…

中国星坤X1224系列线对板连接器:小巧稳定,助力物联网终端高效运行

在物联网、电器和消防等领域&#xff0c;终端设备的安全稳定运行至关重要。为了满足这些领域对连接器高可靠性、小巧轻便和耐高温的需求&#xff0c;X1224系列线对板连接器应运而生。这款连接器以其独特的设计和卓越的性能&#xff0c;成为了终端设备中不可或缺的一部分。 一、…

中英双语介绍加拿大(Canada)

加拿大国家简介 中文版 加拿大简介 加拿大是位于北美洲北部的一个国家&#xff0c;以其广袤的土地、多样的文化和自然美景著称。以下是对加拿大的详细介绍&#xff0c;包括其地理位置、人口、经济、特色、高等教育、著名景点、国家历史和交通条件。 地理位置 加拿大是世界…

Day2用 rustlings 练习 Rust 语言-Move Semantics

大家好 今天 完成 2024年自动驾驶OS开发训练营-初阶营第四期-导学 Day2用 rustlings 练习 Rust 语言 -Move Semantics https://doc.rust-lang.org/stable/book/ch04-00-understanding-ownership.html 提交代码时候 提示 没有权限怎么出来 aciton 参考开发环境配置 https://rcor…

建投数据入选“2024年中国最佳信创企业管理软件厂商”

近日&#xff0c;建投数据凭借国产化自主知识产权、完备的信创资质及信创软硬件环境全栈适配能力&#xff0c;入选第一新声联合天眼查发布的“2024年中国最佳信创厂商系列榜单”细分行业榜之“最佳信创企业管理软件厂商”。 本次最佳信创厂商系列榜单评选&#xff0c;包括综合榜…

从0-1实现一个前端脚手架

https://gitee.com/childe-jia/kfc-cli.git gitee完整地址 介绍 为什么需要脚手架&#xff1f; 脚手架本质就是一个工具&#xff0c;作用是能够让使用者专注于写代码&#xff0c;它可以让我们只用一个命令就生成一个已经配置好的项目&#xff0c;而不用我们再花时间去配置和安…

【python教程】数据分析——numpy、pandas、matplotlib

【python教程】数据分析——numpy、pandas、matplotlib 文章目录 什么是matplotlib安装matplotlib&#xff0c;画个折线 什么是matplotlib matplotlib:最流行的Python底层绘图库&#xff0c;主要做数据可视化图表,名字取材于MATLAB&#xff0c;模仿MATLAB构建 安装matplotlib&…

Idea-Idea配置gitIgnore忽略文件

背景 在项目提交到Git过程中&#xff0c;总有一些文件&#xff0c;例如.idea和.iml等这些我们不想提交的&#xff0c;直接添加进入gitIgnore文件中自动忽略掉。 Idea安装插件 1、在File->Setting->Plugins中搜索gitIgnore并安装插件 2、项目右键new->.ignore File-…