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

摘要:

  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::liststd::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_liststd::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_afterauto 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.mzph.cn/web/41622.shtml

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

相关文章

Halcon 铣刀刀口破损缺陷检测

一 OTSU OTSU&#xff0c;是一种自适应阈值确定的方法,又叫大津法&#xff0c;简称OTSU&#xff0c;是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时&#xff0c;两部分之间的差别应该是最大的&#xff0c;在OTSU算法中所采…

排序 -- 万能测试oj

. - 力扣&#xff08;LeetCode&#xff09; 这道题我们可以使用我们学过的那些常见的排序方法来进行解答 //插入排序 void InsertSort(int* nums, int n) {for (int i 0; i < n-1; i){int end i;int tmp nums[end 1];while (end > 0){if (tmp < nums[end]){nums[…

PyVideoTrans:一款功能全面的视频翻译配音工具!【送源码】

PyVideoTrans是一款功能全面的视频翻译配音工具&#xff0c;专为视频内容创作者设计。它能够将视频中的语言翻译成另一种语言&#xff0c;并自动生成与之匹配的字幕和配音。支持多种语言&#xff0c;包括但不限于中文&#xff08;简繁体&#xff09;、英语、韩语、日语、俄语、…

10、广告-用户数据中心

用户数据中心 用户数据中心在程序化广告中扮演着至关重要的角色&#xff0c;它主要包括DMP原理、用户画像逻辑、Look Alike原理和DMP对接DSP四个部分。下面&#xff0c;我们将详细讲解每个部分的内容。 &#xff08;一&#xff09;DMP原理 数据管理平台&#xff08;Data Man…

Wormhole Filters: Caching Your Hash on Persistent Memory——泛读笔记

EuroSys 2024 Paper 论文阅读笔记整理 问题 近似成员关系查询&#xff08;AMQ&#xff09;数据结构可以高效地近似确定元素是否在集合中&#xff0c;例如Bloom滤波器[10]、cuckoo滤波器[23]、quotient滤波器[8]及其变体。但AMQ数据结构的内存消耗随着数据规模的增长而快速增长…

MSPM0G3507——串口0从数据线传输变为IO口传输

默认的跳线帽时这样的&#xff0c;这样时是数据线传输 需要改成这样&#xff0c;即可用IO口进行数据传输

windows系统本地端口被占用的问题

第一步&#xff1a;查找所有运行的端口 按住“WindowsR”组合键&#xff0c;打开命令窗口&#xff0c;输入【cmd】命令&#xff0c;回车。在弹出的窗口中输入 命令【netstat -ano】&#xff0c;再按一下回车键 Win系统端口被占用-查找所有运行的端口 第二步&#xff1a;查看…

opencv_C++学习笔记(入门30讲)

文章目录 1.配置开发环境2.图像读取与显示3.图像色彩空间转换4.图像对象的创建与赋值5.图像像素的读写操作6.图像像素的算数操作7.滚动条-调整图像亮度8.滚动条-调整对比度和亮度9.键盘响应操作10.图像像素的逻辑操作11.图像的通道分离和合并12.图像色彩空间转换13.图像的像素值…

阿里云存储的降本增效与运维

小浩负责公司存储架构层&#xff0c;需要确保存储层不会成为公司业务系统的性能瓶颈&#xff0c;让数据读写达到最佳性能。那么小浩可以从哪些方面着手优化性能呢&#xff1f;他继续求助系统架构师大雷。 小浩&#xff1a;雷哥&#xff0c;PD反馈公司系统最近响应很慢&#xff…

HTTP模块(一)

HTTP服务 本小节主要讲解HTTP服务如何创建服务&#xff0c;查看HTTP请求&响应报文&#xff0c;还有注意事项说明&#xff0c;另外讲解本地环境&Node环境&浏览器之间的链路图示&#xff0c;如何提取HTTP报文字符串&#xff0c;及报错信息查询。 创建HTTP服务端 c…

lspci

【原】Linux之PCIE三种空间解析 PCIe学习笔记——2.PCIe配置空间 PCIE学习&#xff08;2&#xff09;PCIE配置空间详解 开发者分享 | 使用 lspci 和 setpci 调试 PCIe 问题 b : 字节 w&#xff1a;word L&#xff1a; 4byte

LLM - 词表示和语言模型

一. 词的相似度表示 (1): 用一系列与该词相关的词来表示 (2): 把每个词表示一个独立的符号(one hot) (3): 利用该词上下文的词来表示该词 (3): 建立一个低维度的向量空间&#xff0c;用深度学习方法将该词映射到这个空间里(Word Embedding) 二&#xff1a;语言模型 (1): 根…

Postman中数据文件的高效使用:测试自动化与数据驱动测试实践

摘要 Postman 是一个强大的 API 开发工具&#xff0c;它不仅支持 API 的设计、开发和测试&#xff0c;还提供了数据驱动测试的功能。通过使用数据文件&#xff0c;我们可以模拟不同的测试场景&#xff0c;实现测试的自动化和重复执行。本文将详细介绍如何在 Postman 中使用数据…

PHP-实例-CSRF

1 需求 按照用途分类&#xff1a; 会话&#xff08;会话ID和会话令牌 二选一&#xff09; 会话ID&#xff1a;服务器侧自动生成&#xff0c;自动存储在cookie中&#xff0c;需要在服务器侧存储会话令牌&#xff1a;服务器侧手动生成&#xff0c;手动存储在cookie中&#xff0…

7月07日,每日信息差

第一、6 月份&#xff0c;北京、上海、广州和深圳的新建商品住宅成交量分别环比增加 21%、66%、48% 和 38%&#xff0c;均创年内新高 第二、2024 年世界人工智能大会上&#xff0c;上海向四家企业发放了首批无驾驶人智能网联汽车示范应用许可&#xff0c;这些企业可以在浦东部…

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

52-5 内网代理2 - LCX端口转发(不推荐使用LCX)

环境搭建: 本地开3台虚拟机:kali(必须)、windows2012与2008 (可换成其他windows虚拟机) kali - 网络配置成桥接模式 windows2012 - 设置两个网卡,NAT与桥接模式 注意:windows2012要关闭防火墙,要不然其他主机ping不通 关闭防火墙后再开启远程桌面连接 windwos20…

去O化神器 Exbase

随着去O化进程推动&#xff0c;很多旧业务依赖的oracle数据库&#xff0c;都需要实现做数据库的替换&#xff0c;当下能很好兼容Oracle&#xff0c;并实现异构数据库之间转换的工具并不多。这里给大家推荐一个商业工具数据库迁移工具exbase&#xff08;北京海量&#xff09;&am…

昇思MindSpore 25天学习打卡营|day18

DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动漫头像数据集共有70,171张动漫头像图片&#xff0c;图片大小均为96*96。 GAN基础原理 这部分原…

想知道你的电脑能不能和如何升级RAM吗?这里有你想要的一些提示

考虑给你的电脑增加更多的RAM,但不确定从哪里开始?本指南涵盖了有关升级Windows PC或笔记本电脑中RAM的所有信息。 你需要升级RAM吗 在深入研究升级RAM的过程之前,评估是否需要升级是至关重要的。你是否经历过系统滞后、频繁的BSOD错误或应用程序和程序突然崩溃?这些症状…