C++核心编程之STL
STL初识:从零开始的奇幻冒险
1 STL的诞生:一场代码复用的革命
很久很久以前,在编程的世界里,开发者们每天都在重复造轮子。无论是数据结构还是算法,每个人都得从头开始写,仿佛在无尽的沙漠中寻找绿洲。直到有一天,C++的面向对象和泛型编程思想横空出世,带来了复用性的曙光。于是,STL(Standard Template Library,标准模板库)应运而生,成为了拯救开发者于水深火热中的英雄。
2 STL基本概念:容器、算法与迭代器的三角恋
STL,全称标准模板库,是C++中的一把瑞士军刀。它主要由三大核心组成:
-
容器(Container):用来存放数据的各种数据结构,比如数组、链表、栈、队列等。
-
算法(Algorithm):用来处理数据的各种操作,比如排序、查找、遍历等。
-
迭代器(Iterator):容器和算法之间的桥梁,让它们能够无缝连接。
STL的代码几乎都是模板类或模板函数,这意味着你可以用一套代码处理各种数据类型,真正做到“一次编写,到处运行”。
3 STL六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器
STL不仅仅是一个库,它更像是一个精密的机器,由六大组件构成:
-
容器:各种数据结构,如
vector
、list
、map
等,用来存放数据。 -
算法:各种常用的操作,如
sort
、find
、copy
等,用来处理数据。 -
迭代器:容器和算法之间的胶水,让它们能够协同工作。
-
仿函数:行为像函数的对象,可以作为算法的策略。
-
适配器:用来修饰容器、仿函数或迭代器的接口,让它们更灵活。
-
空间配置器:负责内存的分配与管理,确保资源的高效利用。
这六大组件共同构成了STL的强大功能,让开发者能够轻松应对各种复杂的编程任务。
4 容器、算法、迭代器:STL的三剑客
容器:你可以把它想象成一个魔法背包,里面可以装各种类型的数据。STL提供了多种容器,比如vector
(动态数组)、list
(链表)、map
(映射表)等。这些容器分为两类:
-
序列式容器:元素按顺序排列,比如
vector
和list
。 -
关联式容器:元素之间没有严格的物理顺序,通常基于二叉树结构,比如
map
和set
。
算法:算法就像是解决问题的魔法咒语。STL提供了大量的算法,比如sort
(排序)、find
(查找)、for_each
(遍历)等。算法分为两类:
-
质变算法:会改变容器中的元素,比如
copy
和replace
。 -
非质变算法:不会改变容器中的元素,比如
find
和count
。
迭代器:迭代器就像是魔法棒,让你能够遍历容器中的元素,而不需要知道容器的内部结构。每个容器都有自己的迭代器,迭代器的种类也很多,从简单的输入迭代器到功能强大的随机访问迭代器,应有尽有。
每个容器都有自己专属的迭代器。迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。
种类 | 功能 | 支持运算 |
---|---|---|
输入迭代器 | 对数据的只读访问 | 只读,支持++、==、!= |
输出迭代器 | 对数据的只写访问 | 只写,支持++ |
前向迭代器 | 读写操作,并能向前推进迭代器 | 读写,支持++、==、!= |
双向迭代器 | 读写操作,并能向前和向后操作 | 读写,支持++、-- |
随机访问迭代器 | 读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器 | 读写,支持++、--、[n]、-n、<、<=、>、>= |
常用的容器中迭代器种类为双向迭代器和随机访问迭代器
5 容器算法迭代器初识:从代码中感受STL的魅力
5.1 vector存放内置数据类型
vector
是STL中最常用的容器之一,你可以把它看作是一个动态数组。下面是一个简单的例子,展示了如何向vector
中插入数据并遍历它:
- 容器: vector
- 算法: for_each
- 迭代器: vector<int>::iterator
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm> // 标准算法头文件// vector存放内置数据类型void myPrint(int val)
{cout<< val << endl;
}void test01()
{// 创建了一个vector容器,数组vector<int> v;// 向容器中插入数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);// 通过迭代器访问容器中的数据// vector<int>::iterator itBegin = v.begin(); //起始迭代器,指向容器中第一个元素// vector<int>::iterator itEnd = v.end(); // 结束迭代器,指向容器中最后一个元素的下一个位置// // 第一种遍历方式// while (itBegin != itEnd)// {// cout<<*itBegin<<endl;// itBegin++;// }// // 第二种遍历方式 就是将上面的进行改进优化// for(vector<int>::iterator it=v.begin();it != v.end(); it++)// {// cout<<*it<<endl;// }// 第三种遍历方式 利用STL提供遍历算法for_each(v.begin(), v.end(), myPrint);}int main()
{test01();system("pause");return 0;
}
5.2 Vector存放自定义数据类型
vector
不仅可以存放内置数据类型,还可以存放自定义的数据类型。比如,我们可以创建一个Person
类,并将其对象存入vector
中:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm> // 标准算法头文件
#include<string>// vector存放自定义数据类型
class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};void test01()
{vector<Person>v;Person p1("孙悟空", 25);Person p2("猪八戒", 15);Person p3("钟无艳", 36);Person p4("兰陵王", 50);Person p5("安琪拉", 18);// 向容器中添加数据v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);// 遍历容器数据for(vector<Person>::iterator it=v.begin(); it!=v.end();it++){// cout<<"姓名:"<< (*it).m_Name<<" 年龄:"<<(*it).m_Age<<endl;cout<<"姓名:"<< it->m_Name <<" 年龄:"<< it->m_Age <<endl;}}// 存放自定义数据类型 指针
void test02()
{vector<Person*>v;Person p1("孙悟空", 25);Person p2("猪八戒", 15);Person p3("钟无艳", 36);Person p4("兰陵王", 50);Person p5("安琪拉", 18);// 向容器中添加数据v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);v.push_back(&p5);// 遍历容器数据for(vector<Person*>::iterator it=v.begin(); it!=v.end();it++){cout<<"姓名:"<< (*it)->m_Name<<" 年龄:"<<(*it)->m_Age<<endl;// cout<<"姓名:"<< it->m_Name <<" 年龄:"<< it->m_Age <<endl;}
}int main()
{// test01();test02();system("pause");return 0;
}
5.3 Vector容器嵌套容器
STL的容器还可以嵌套使用,比如vector
中可以存放另一个vector
。下面是一个嵌套容器的例子:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm> // 标准算法头文件
#include<string>// vector容器嵌套容器
void test01()
{vector< vector<int>>v;// 创建小容器vector<int>v1;vector<int>v2;vector<int>v3;vector<int>v4;// 向小容器中添加数据for(int i=0;i<4;i++){v1.push_back(i+1);v2.push_back(i+2);v3.push_back(i+3);v4.push_back(i+4);}// 将小容器插入大容器中v.push_back(v1);v.push_back(v2);v.push_back(v3);v.push_back(v4);// 通过大容器,把所有数据遍历一遍for(vector<vector<int>>::iterator it=v.begin();it!=v.end();it++){// (*it) ---- 容器 vector<int>for(vector<int>::iterator vit=(*it).begin(); vit!=(*it).end();vit++){cout<<*vit<<" ";}cout<<endl;}}int main()
{test01();system("pause");return 0;
}
结语:STL的奇幻之旅才刚刚开始
STL就像是一个充满魔法的工具箱,里面装满了各种强大的工具。通过容器、算法和迭代器的组合,你可以轻松解决各种复杂的编程问题。这只是STL的入门,随着你深入学习,你会发现它的更多神奇之处。准备好踏上这段奇幻的编程之旅了吗?STL的世界正等着你去探索!
相关文章:
C++核心编程之STL
STL初识:从零开始的奇幻冒险 1 STL的诞生:一场代码复用的革命 很久很久以前,在编程的世界里,开发者们每天都在重复造轮子。无论是数据结构还是算法,每个人都得从头开始写,仿佛在无尽的沙漠中寻找绿洲。直到…...

Mac mini M4安装nvm 和node
先要安装Homebrew(如果尚未安装)。在终端中输入以下命令: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 根据提示操作完成Homebrew的安装。 安装nvm。在终端中输入以下命令…...

Level DB --- 写流程架构
Level DB是高效的k-v数据库,接受多线程写,既要保证多线程写临界区安全,同时又要保证写流程的尽量高效性。 写入数据 Level DB 用一个deque用来衔接生产-消费模型。一个新的kv写入请求,会先将kv封装成Writer结构体。插入之前要先…...

【中等】707.设计链表
题目描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中的…...
深入理解Reactor Flux的生成方法
在Reactor框架中,Flux 是一个非常重要的概念,它用于表示一个可以产生多个事件的响应式流。通过 Flux 提供的多种生成方法,我们可以灵活地创建各种类型的流。本文将详细介绍 Flux.generate 方法的使用,并通过实例帮助读者更好地理解…...
next实现原理
Next.js 是一个基于 React 的 服务器端渲染(SSR) 和 静态生成(SSG) 框架,它的实现原理涉及多个关键技术点,包括 服务端渲染(SSR)、静态生成(SSG)、客户端渲染…...
LeetCode 热题 100 53. 最大子数组和
LeetCode 热题 100 | 53. 最大子数组和 大家好,今天我们来解决一道经典的算法题——最大子数组和。这道题在 LeetCode 上被标记为中等难度,要求我们找出一个具有最大和的连续子数组,并返回其最大和。下面我将详细讲解解题思路,并…...

DeepSeek 与大数据治理:AI 赋能数据管理的未来
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在当今数字化时代,数据已成为企业和机构的重要资产,而大数据治理(Big Data Governan…...

【时时三省】(C语言基础)浮点型数据
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 浮点型数据 浮点型数据是用来表示具有小数点的实数的,为什么在C中把实数称为浮点数呢?在C语言中,实数是以指数正式存放在在储单元中的。一个实数表示为指数可以有不…...

【大模型】Ollama本地部署DeepSeek大模型:打造专属AI助手
【大模型】Ollama本地部署DeepSeek大模型:打造专属AI助手 Ollama本地部署DeepSeek大模型:打造专属AI助手一、Ollama简介二、硬件需求三、部署步骤1. 下载并安装Ollama(1)访问Ollama官网(2)安装Ollama 2. 配…...

2025.3.2机器学习笔记:PINN文献阅读
2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊: Water Resource…...

数据集笔记:新加坡 地铁(MRT)和轻轨(LRT)票价
数据连接 data.gov.sg 2024 年 12 月 28 日起生效的新加坡地铁票价 该数据集包含 MRT 和 LRT 票价的信息,包括: 票价类型(Fare Type):成人票、学生票、老年人票、残障人士票等。适用时间(Applicable Tim…...

如何修改安全帽/反光衣检测AI边缘计算智能分析网关V4的IP地址?
TSINGSEE青犀推出的智能分析网关V4,是一款集成了BM1684芯片的高性能AI边缘计算智能硬件。其内置的高性能8核ARM A53处理器,主频可高达2.3GHz,INT8峰值算力更是达到了惊人的17.6Tops。此外,该硬件还预装了近40种AI算法模型…...

Java 大视界 -- 基于 Java 的大数据分布式缓存一致性维护策略解析(109)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

SyntaxError: positional argument follows keyword argument
命令行里面日常练手爬虫不注意遇到的问题,报错说参数位置不正确 修改代码后,运行如下图: 结果: 希望各位也能顺利解决问题,祝你好运!...

Ruby基础
一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串,并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串,()内可以是任何数,自动转义双引号%Q("aaaaa"…...
JMeter 断言最佳实践
JMeter 断言最佳实践 一、引言 在使用 JMeter 进行性能测试或功能测试时,断言是非常重要的一部分。断言可以帮助我们验证接口返回的结果是否符合预期,确保测试的准确性和可靠性。本文将介绍 JMeter 中常见的断言类型、使用这些断言的最佳实践ÿ…...

【Android】类加载器热修复-随记(二)
1. 背景 在【Android】类加载器&热修复-随记一文中了解了类加载,要完成完整的热修复过程,我们需要构建出差量jar包。而这构建差量包分为两个步骤: 原包,注解解析和插桩;变更后,差量包构建;在这两步过程中会涉及到较多的字节码操作,这里我们需要了解下。我们都听过…...

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表
简单画了个聊天框 就是咱们的HomePage.jsx 1.后端接口开发 在server/src/index.js 新增 messagesRoutes 先引入 import messageRoutes from ./routes/message.route.js // 消息接口 app.use(/api/messages, messageRoutes) 在routes文件夹下新建message.route.js 有3个路…...

Linux网络 TCP全连接队列与tcpdump抓包
TCP全连接队列 在 Linux 网络中,TCP 全连接队列(也称为 Accept 队列)是一个重要的概念,用于管理已经完成三次握手,即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接,避免因…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...