当前位置: 首页 > news >正文

C++核心编程之STL

STL初识:从零开始的奇幻冒险

1 STL的诞生:一场代码复用的革命

        很久很久以前,在编程的世界里,开发者们每天都在重复造轮子。无论是数据结构还是算法,每个人都得从头开始写,仿佛在无尽的沙漠中寻找绿洲。直到有一天,C++的面向对象泛型编程思想横空出世,带来了复用性的曙光。于是,STL(Standard Template Library,标准模板库)应运而生,成为了拯救开发者于水深火热中的英雄。

2 STL基本概念:容器、算法与迭代器的三角恋

STL,全称标准模板库,是C++中的一把瑞士军刀。它主要由三大核心组成:

  • 容器(Container):用来存放数据的各种数据结构,比如数组、链表、栈、队列等。

  • 算法(Algorithm):用来处理数据的各种操作,比如排序、查找、遍历等。

  • 迭代器(Iterator):容器和算法之间的桥梁,让它们能够无缝连接。

STL的代码几乎都是模板类或模板函数,这意味着你可以用一套代码处理各种数据类型,真正做到“一次编写,到处运行”。

3 STL六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器

STL不仅仅是一个库,它更像是一个精密的机器,由六大组件构成:

  1. 容器:各种数据结构,如vectorlistmap等,用来存放数据。

  2. 算法:各种常用的操作,如sortfindcopy等,用来处理数据。

  3. 迭代器:容器和算法之间的胶水,让它们能够协同工作。

  4. 仿函数:行为像函数的对象,可以作为算法的策略。

  5. 适配器:用来修饰容器、仿函数或迭代器的接口,让它们更灵活。

  6. 空间配置器:负责内存的分配与管理,确保资源的高效利用。

这六大组件共同构成了STL的强大功能,让开发者能够轻松应对各种复杂的编程任务。

4 容器、算法、迭代器:STL的三剑客

容器:你可以把它想象成一个魔法背包,里面可以装各种类型的数据。STL提供了多种容器,比如vector(动态数组)、list(链表)、map(映射表)等。这些容器分为两类:

  • 序列式容器:元素按顺序排列,比如vectorlist

  • 关联式容器:元素之间没有严格的物理顺序,通常基于二叉树结构,比如mapset

算法:算法就像是解决问题的魔法咒语。STL提供了大量的算法,比如sort(排序)、find(查找)、for_each(遍历)等。算法分为两类:

  • 质变算法:会改变容器中的元素,比如copyreplace

  • 非质变算法:不会改变容器中的元素,比如findcount

迭代器:迭代器就像是魔法棒,让你能够遍历容器中的元素,而不需要知道容器的内部结构。每个容器都有自己的迭代器,迭代器的种类也很多,从简单的输入迭代器到功能强大的随机访问迭代器,应有尽有。

        每个容器都有自己专属的迭代器。迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。

迭代器种类
种类功能支持运算
输入迭代器对数据的只读访问只读,支持++、==、!=
输出迭代器对数据的只写访问只写,支持++
前向迭代器读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器读写操作,并能向前和向后操作读写,支持++、--
随机访问迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器读写,支持++、--、[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初识&#xff1a;从零开始的奇幻冒险 1 STL的诞生&#xff1a;一场代码复用的革命 很久很久以前&#xff0c;在编程的世界里&#xff0c;开发者们每天都在重复造轮子。无论是数据结构还是算法&#xff0c;每个人都得从头开始写&#xff0c;仿佛在无尽的沙漠中寻找绿洲。直到…...

Mac mini M4安装nvm 和node

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

Level DB --- 写流程架构

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

【中等】707.设计链表

题目描述 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的…...

深入理解Reactor Flux的生成方法

在Reactor框架中&#xff0c;Flux 是一个非常重要的概念&#xff0c;它用于表示一个可以产生多个事件的响应式流。通过 Flux 提供的多种生成方法&#xff0c;我们可以灵活地创建各种类型的流。本文将详细介绍 Flux.generate 方法的使用&#xff0c;并通过实例帮助读者更好地理解…...

next实现原理

Next.js 是一个基于 React 的 服务器端渲染&#xff08;SSR&#xff09; 和 静态生成&#xff08;SSG&#xff09; 框架&#xff0c;它的实现原理涉及多个关键技术点&#xff0c;包括 服务端渲染&#xff08;SSR&#xff09;、静态生成&#xff08;SSG&#xff09;、客户端渲染…...

LeetCode 热题 100 53. 最大子数组和

LeetCode 热题 100 | 53. 最大子数组和 大家好&#xff0c;今天我们来解决一道经典的算法题——最大子数组和。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求我们找出一个具有最大和的连续子数组&#xff0c;并返回其最大和。下面我将详细讲解解题思路&#xff0c;并…...

DeepSeek 与大数据治理:AI 赋能数据管理的未来

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在当今数字化时代&#xff0c;数据已成为企业和机构的重要资产&#xff0c;而大数据治理&#xff08;Big Data Governan…...

【时时三省】(C语言基础)浮点型数据

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

【大模型】Ollama本地部署DeepSeek大模型:打造专属AI助手

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

2025.3.2机器学习笔记:PINN文献阅读

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

数据集笔记:新加坡 地铁(MRT)和轻轨(LRT)票价

数据连接 data.gov.sg 2024 年 12 月 28 日起生效的新加坡地铁票价 该数据集包含 MRT 和 LRT 票价的信息&#xff0c;包括&#xff1a; 票价类型&#xff08;Fare Type&#xff09;&#xff1a;成人票、学生票、老年人票、残障人士票等。适用时间&#xff08;Applicable Tim…...

如何修改安全帽/反光衣检测AI边缘计算智能分析网关V4的IP地址?

TSINGSEE青犀推出的智能分析网关V4&#xff0c;是一款集成了BM1684芯片的高性能AI边缘计算智能硬件。其内置的高性能8核ARM A53处理器&#xff0c;主频可高达2.3GHz&#xff0c;INT8峰值算力更是达到了惊人的17.6Tops。此外&#xff0c;该硬件还预装了近40种AI算法模型&#xf…...

Java 大视界 -- 基于 Java 的大数据分布式缓存一致性维护策略解析(109)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

SyntaxError: positional argument follows keyword argument

命令行里面日常练手爬虫不注意遇到的问题&#xff0c;报错说参数位置不正确 修改代码后&#xff0c;运行如下图&#xff1a; 结果&#xff1a; 希望各位也能顺利解决问题&#xff0c;祝你好运&#xff01;...

Ruby基础

一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串&#xff0c;并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串&#xff0c;&#xff08;&#xff09;内可以是任何数&#xff0c;自动转义双引号%Q("aaaaa"…...

JMeter 断言最佳实践

JMeter 断言最佳实践 一、引言 在使用 JMeter 进行性能测试或功能测试时&#xff0c;断言是非常重要的一部分。断言可以帮助我们验证接口返回的结果是否符合预期&#xff0c;确保测试的准确性和可靠性。本文将介绍 JMeter 中常见的断言类型、使用这些断言的最佳实践&#xff…...

【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 网络中&#xff0c;TCP 全连接队列&#xff08;也称为 Accept 队列&#xff09;是一个重要的概念&#xff0c;用于管理已经完成三次握手&#xff0c;即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接&#xff0c;避免因…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...