【C++STL :list类 (一) 】C++98 完全指南:std::list 详解与源码剖析

【C++STL :list类 (一) 】C++98 完全指南:std::list 详解与源码剖析

   

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:


🎬艾莉丝的C++专栏简介:


目录

C++的两个参考文档

1  ~>  初识List:特性与能力介绍

2  ~>  list 的核心接口与基本操作

2.1  list:构造函数

2.2  list:iterator的使用

2.2.1  list iterator使用的表格总结

2.2.2  注意事项

2.3  list:capacity

2.4  list:element access

2.5  list:modifiers

本文代码完整展示

Test.c:

结尾


C++的两个参考文档

老朋友(非官方文档):cplusplus

官方文档(同步更新):cppreference
list容器文档链接:list


1  ~>  初识List:特性与能力介绍

 list容器文档链接:list


2  ~>  list 的核心接口与基本操作

list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已 达到可扩展的能力。以下为list中一些常见的重要接口——

2.1  list:构造函数

链接:constructor

构造函数(constructor接口说明详细说明
list()构造空的list创建一个不包含任何元素的空list,使用默认构造的分配器
explicit list(size_type n, const value_type& val = value_type())构造包含n个值为val元素的list创建包含n个元素的list,每个元素都是val的副本。如果val省略,则使用value_type的默认构造函数
list(const list& x)拷贝构造函数创建x的副本,包含x中所有元素的拷贝,使用x的分配器
 template <class
InputIterator>
list(InputIterator first,
InputIterator last>
 
用[first, last)区间中的元素构造list构造包含区间[first, last)中元素副本的list。InputIterator可以是任何输入迭代器类型,区间包含first但不包含last

2.2  list:iterator的使用

这里大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点

2.2.1  list iterator使用的表格总结

链接:

begin

end

rbegin

rend
函数声明接口说明详细说明
iterator begin();
const_iterator begin() const;
返回指向list中第一个元素的迭代器如果list为空,返回的迭代器等于end()。const版本用于const对象,返回的迭代器不允许修改元素值
iterator end();
const_iterator end() const;
返回指向list中最后一个元素下一个位置的迭代器这是"尾后迭代器",不指向任何实际元素,常用于作为循环结束条件。对end()解引用是未定义行为
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
返回指向list中最后一个元素的反向迭代器反向迭代器从尾部向头部移动。rbegin()指向最后一个元素,++rbegin()向前移动一个元素
reverse_iterator rend();
const_reverse_iterator rend() const;
返回指向list中第一个元素前一个位置的反向迭代器反向迭代器的结束位置,不指向任何实际元素。rend()begin()之前的位置

2.2.2  注意事项

1、begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动;

2、rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动。

2.3  list:capacity

链接:

empty

size
函数声明接口说明详细说明
bool empty() const;检测list是否为空如果list中不包含任何元素(size为0)则返回true,否则返回false。此操作通常很快,时间复杂度为O(1)
size_type size() const;返回list中元素的数量返回list当前包含的元素个数。在C++98中,此操作的时间复杂度为O(1),因为标准要求size()必须在常数时间内完成

2.4  list:element access

链接:

front

back
函数声明接口说明详细说明
reference front();
const_reference front() const;
返回list的第一个元素的引用提供对list中第一个元素的直接访问。如果list为空,调用此函数是未定义行为。非const版本允许修改元素值,const版本用于只读访问
reference back();
const_reference back() const;
返回list的最后一个元素的引用提供对list中最后一个元素的直接访问。如果list为空,调用此函数是未定义行为。非const版本允许修改元素值,const版本用于只读访问

2.5  list:modifiers

链接:

push_front

pop_front

push_back

pop_back

insert

erase

swap

clear
函数声明接口说明详细说明
void push_front(const T& val);在list首元素前插入值为val的元素将新元素插入到list的开头位置,该元素成为新的第一个元素。插入操作是常数时间复杂度O(1)
void pop_front();删除list中第一个元素移除list的第一个元素。如果list为空,调用此函数是未定义行为。被删除元素的析构函数会被调用
void push_back(const T& val);在list尾部插入值为val的元素将新元素插入到list的末尾位置,该元素成为新的最后一个元素。插入操作是常数时间复杂度O(1)
void pop_back();删除list中最后一个元素移除list的最后一个元素。如果list为空,调用此函数是未定义行为。被删除元素的析构函数会被调用
iterator insert(iterator position, const T& val);在指定位置插入元素在position指定的位置之前插入值为val的元素,返回指向新插入元素的迭代器。插入操作是常数时间复杂度O(1)
iterator erase(iterator position);删除指定位置的元素删除position位置的元素,返回指向被删除元素之后元素的迭代器。如果删除的是最后一个元素,则返回end()
void swap(list& x);交换两个list的内容交换当前list与x的内容。此操作不会移动或拷贝元素,只是交换内部指针,因此是常数时间复杂度O(1)
void clear();清空list中的所有元素移除list中的所有元素,使size()变为0。所有元素的析构函数会被调用
list中还有一些操作,需要用到时大家可参阅list的文档说明。

本文代码完整展示

Test.c:

// list部分内容 #include<list> #include<algorithm> int main() { list<int> lt1; list<int> lt2 = { 1,2,3,4,5 }; list<int>::iterator it2 = lt2.begin(); while (it2 != lt2.end()) { cout << *it2 << " "; ++it2; } cout << endl; for (auto e : lt2) { cout << e << " "; } cout << endl; auto pos = find(lt2.begin(), lt2.end(), 3); if (pos != lt2.end()) { lt2.insert(pos, 30);// pos没有失效,因为 lt2.erase(pos); // pos失效了 //cout << *pos << endl; } for (auto e : lt2) { cout << e << " "; } cout << endl; jqj::vector<int> v3 = { 10,20,30,40 }; //sort(lt2.begin(), lt2.end());// 不支持 lt2.sort(); sort(v3.begin(), v3.end()); list<int> lt3 = { 1,2,2,3,3,2,3,4,5 }; for (auto e : lt3) { cout << e << " "; } cout << endl; lt3.sort(); lt3.unique(); // 去重 for (auto e : lt3) { cout << e << " "; } cout << endl; // 4这个节点挪到头位置 list<int> lt4 = { 1,2,3,4,5 }; for (auto e : lt4) { cout << e << " "; } cout << endl; pos = find(lt4.begin(), lt4.end(), 4); lt4.splice(lt4.begin(), lt4.end(), pos); for (auto e : lt4) { cout << e << " "; } cout << endl; return 0; }

结尾

往期回顾:

【C++STL :vector类 (二) 】C++ Vector迭代器失效避坑指南:原因与解决方案详解

结语:都看到这里啦!那请大佬不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა


Read more

3大开源修复模型横评:云端镜像快速部署,1天完成全面测试

3大开源修复模型横评:云端镜像快速部署,1天完成全面测试 你是不是也遇到过这样的情况:团队要选一个AI图像修复工具,大家各自在本地跑GFPGAN、CodeFormer、GPEN,结果有人用笔记本CPU跑,有人用高端显卡,测试速度、画质效果完全没法比?最后开会讨论时,谁的电脑配置高,谁的结果就“看起来更好”,根本没法做出公正决策。 这正是很多技术主管在搭建AI工具链时最头疼的问题——缺乏统一、可复现的测试环境。不同设备、不同依赖版本、不同参数设置,导致评估结果偏差巨大,选型变成“看运气”。 别急,今天我就来帮你解决这个痛点。我们不靠本地部署“拼电脑”,而是直接上云端标准化镜像环境,一键部署三大主流开源人脸修复模型:GFPGAN、CodeFormer 和 GPEN,在相同GPU资源下完成公平对比测试,1天内搞定从部署到出报告的全流程。 ZEEKLOG星图平台提供了预置好这三大模型的AI镜像,无需手动安装复杂依赖,不用折腾CUDA、PyTorch版本兼容问题,点击即用,还能对外暴露API服务,方便团队成员远程调用测试。整个过程就像租了一台“AI修复工作站”,谁都能用,结果可比对。

By Ne0inhk
手把手教你在GitHub上运行开源项目(新手必看版)

手把手教你在GitHub上运行开源项目(新手必看版)

📦 说在前面 GitHub这个程序员宝藏平台(我愿称之为代码界的金矿),每天都有成千上万的开源项目更新。但是很多新手朋友看到那些酷炫项目时,经常会遇到三大灵魂拷问:这项目怎么跑起来?需要装什么软件?报错了怎么办?今天咱们就用最接地气的方式,手把手教你从0到1运行GitHub项目! 🔧 准备工具包(装机三件套) 1. 代码编辑器(必装) 推荐直接上VS Code这个万金油,装好记得在扩展商店安装这两个插件: * GitLens(代码时光机,能看到每行代码的修改记录) * Code Runner(一键运行脚本的神器) (超级重要)👉 如果项目里有.vscode文件夹,一定要用VS Code打开,里面可能有预置的调试配置! 2. Git客户端(下载代码必备) Windows用户直接装Git for Windows,安装时记得勾选这个选项: Use Git and optional Unix tools from the Command Prompt (这样就能在CMD里用Linux命令了,真香!

By Ne0inhk
弃用MobaXterm,拥抱开源软件Tabby

弃用MobaXterm,拥抱开源软件Tabby

目录 * 引言 * MobaXterm * MobaXterm - Windows下的增强型终端 * 🚀 核心功能点 * 🖥️ X服务器功能 * 💻 终端功能 * 🌐 网络协议支持 * 📁 文件管理功能 * 🔧 高级功能 * 🎨 界面定制 * 📊 会话管理 * 🔌 插件系统 * 🔒 安全功能 * 📱 便携特性 * 🌍 多语言支持 * 📈 专业版增强功能 * 版本说明: * 🔹 家庭版 (Home Edition) * 🔸 专业版 (Professional Edition) * 企业使用建议: * 使用场景: * Tabby * Tabby - 现代化的终端模拟器 * 🚀 核心功能点 * 💻 终端功能 * 🎨 界面定制 * 🔗 网络连接功能 * SSH客户端 * 其他协议 *

By Ne0inhk
第4章:开源模型全景图:如何选择你的技术底座

第4章:开源模型全景图:如何选择你的技术底座

第4章:开源模型全景图:如何选择你的技术底座 引言 开源大模型生态正在经历爆炸式增长。截至2024年6月,HuggingFace平台托管的模型数量已超过50万个,每月新增数千个模型。面对如此庞杂的选择,技术决策者往往陷入两难:是选择规模最大、性能最强的模型,还是选择更符合实际约束的务实方案?本章将建立一套系统的模型选型框架,通过参数规模-性能曲线分析、推理成本量化和许可证风险评估,为技术决策提供科学依据。 1. 开源模型生态现状分析 1.1 主流开源模型系列对比 当前开源大模型生态已形成多个技术流派,各具特色: Llama系列(Meta): * 技术特点:基于Transformer解码器架构,使用RoPE位置编码,采用Grouped-Query Attention优化 * 开源策略:社区友好许可证,允许商业使用(需申请) * 代表型号:Llama-2-7B/13B/70B,Llama-3-8B/70B * 优势:生态完善,工具链成熟,微调资源丰富 Mistral系列: * 技术特点:采用滑动窗口注意力(Sliding Window

By Ne0inhk