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

【C++】STL初识

【C++】STL初识


文章目录

  • 【C++】STL初识
  • 前言
  • 一、STL基本概念
  • 二、STL六大组件简介
  • 三、STL三大组件
  • 四、初识STL
  • 总结


前言

本篇文章将讲到STL基本概念,STL六大组件简介,STL三大组件,初识STL。


一、STL基本概念

STL(Standard Template Library,标准模板库)
STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。

二、STL六大组件简介

STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

  • 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template
  • 算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.
  • 迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器
  • 仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template
  • 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  • 空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置空间管理空间释放的class tempalte.

STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

STL优点:STL 具有高可重用性,高性能,高移植性,跨平台的优点。


三、STL三大组件

  • 容器

常用的数据结构:数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器关联式容器两种
序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。Vector容器、Deque容器、List容器等。
关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。Set/multiset容器 Map/multimap容器

  • 算法

算法分为:质变算法非质变算法
质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

  • 迭代器

这里是引用


四、初识STL

vector容器 vectorv
vector::iterator itBegin = v.begin(); //v.begin() 起始迭代器,指向容器中第一个数据
vector::iterator itEnd = v.end(); //v.end();结束迭代器,指向的是容器中最后一个元素的下一个位置
利用算法遍历容器
for_each(v.begin(),v.end() , myPrint ) 头文件 algorithm
容器中存放自定义数据类型
容器中存放自定义数据类型指针
容器嵌套容器

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>//原生指针也是迭代器
void test01()
{int arr[5] = { 1, 2,3 ,4,5 };int* p = arr;for (int i = 0; i < 5; i++){//cout << arr[i] << endl;cout << *(p++) << endl;}
}void myPrint(int val)
{cout << val << endl;
}void test02()
{vector<int> v; //创建一个victor容器,容器中存放的元素是int 类型;//插入元素v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);//遍历元素vector<int>::iterator itBegin = v.begin();  //v.begin() 起始迭代器,指向容器中第一个数据vector<int>::iterator itEnd = v.end();  //v.end();结束迭代器,指向的是容器中最后一个元素的下一个位置//第一种遍历//while (itBegin != itEnd)//{//	cout << *itBegin << endl;//	itBegin++;//}//第二种遍历//for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//{//	cout << *it << endl;//}//第三种遍历for_each(itBegin, itEnd, myPrint);for_each(v.begin(), v.end(), myPrint);
}//自定义数据类型
class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};void test03()
{vector<Person> v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);//每个容器都有自己的专属迭代器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 test04()
{vector<Person*> v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++){// * it ---- Person*cout << "姓名:" << (*it)->m_name << "年龄:" << (*it)->m_age << endl;}
}//容器嵌套容器
void test05()
{vector<vector<int>>v;vector<int>v1;vector<int>v2;vector<int>v3;for (int i = 0; i < 5; i++){v1.push_back(i);v2.push_back(i + 10);v3.push_back(i + 100);}v.push_back(v1);v.push_back(v2);v.push_back(v3);for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++){for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++){cout << *vit << " ";}cout << endl;}}int main() {//test01();//test02();//test03();//test04();test05();system("pause");return EXIT_SUCCESS;
}

总结

STL六大组件
容器、算法、迭代器、仿函数、适配器、空间配置器
STL优点
内建在C++编译器中,不需要安装额外内容
不需要了解具体实现内容,只要熟练运用即可
高复用,可移植,高性能
容器划分
序列式容器
关联式容器 有个key起到索引作用
算法
质变算法
非质变算法
STL初识
vector容器 vectorv
vector::iterator itBegin = v.begin(); //v.begin() 起始迭代器,指向容器中第一个数据
vector::iterator itEnd = v.end(); //v.end();结束迭代器,指向的是容器中最后一个元素的下一个位置
利用算法遍历容器
for_each(v.begin(),v.end() , myPrint ) 头文件 algorithm
容器中存放自定义数据类型
容器中存放自定义数据类型指针
容器嵌套容器

相关文章:

【C++】STL初识

【C】STL初识 文章目录 【C】STL初识前言一、STL基本概念二、STL六大组件简介三、STL三大组件四、初识STL总结 前言 本篇文章将讲到STL基本概念&#xff0c;STL六大组件简介&#xff0c;STL三大组件&#xff0c;初识STL。 一、STL基本概念 STL(Standard Template Library,标准…...

框架篇补充(东西多 需要重新看网课)

什么是AOP 面向切面编程 降低耦合 提高代码的复用 Spring的bean的生命周期 实例化bean 赋值 初始化bean 使用bean 销毁bean SpringMVC的执行流程 Springboot自动装配原理 实际上就是为了从spring.factories文件中 获取到对应的需要 进行自动装配的类 并生成相应的Bean…...

合约门合同全生命周期管理系统:企业合同管理的数字化转型之道

合约门合同全生命周期管理系统&#xff1a;企业合同管理的数字化转型之道 1. 引言 在现代企业中&#xff0c;合同管理已经不再是简单的文件存储和审批流程&#xff0c;而是企业合规性、风险管理和业务流程的关键环节之一。随着企业规模的扩大和合同数量的增加&#xff0c;传统…...

等保测评与风险管理:识别、评估和缓解潜在的安全威胁

在信息化时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;而信息安全则成为守护这份资产免受侵害的重中之重。等保测评&#xff08;信息安全等级保护测评&#xff09;作为保障信息系统安全的重要手段&#xff0c;其核心在于通过科学、规范、专业的评估手段&#xf…...

Golang Agent 可观测性的全面升级与新特性介绍

作者&#xff1a;张海彬&#xff08;古琦&#xff09; 背景 自 2024 年 6 月 26 日&#xff0c;ARMS 发布了针对 Golang 应用的可观测性监控功能以来&#xff0c;阿里云 ARMS 团队与程序语言与编译器团队一直致力于不断优化和提升该系统的各项功能&#xff0c;旨在为开发者提…...

SpringBoot的开篇 特点 初始化 ioc 配置文件

文章目录 前言SpringBoot发展历程SpringBoot前置准备SpringBoot特点 SpringBoot项目初始化项目启动Springboot的核心概念IOC概念介绍Bean对象通过注解扫描包 例子配置文件 前言 SpringBoot发展历程 最初&#xff0c;Spring框架的使用需要大量的XML配置&#xff0c;这使得开发…...

docker 可用镜像服务地址(2024.10.25亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…...

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…...

【C++】 string的了解及使用

标准库中的string类 在使用string类时&#xff0c;必须包含#include头文件以及using namespace std; string类的常用接口说明 C中string为我们提供了丰富的接口来供我们使用 – string接口文档 这里我们只介绍一些常见的接口 string类对象的常见构造 #include <iostrea…...

【K8S】kubernetes-dashboard.yaml

https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml 以下链接的内容&#xff1a; 由于国内访问不了&#xff0c;找到一些方法下载了这个文件内容&#xff0c; 部署是mages 对象的镜像 WEB docker.io/kubernetesui/dash…...

远程root用户访问服务器中的MySQL8

一、Ubuntu下的MySQL8安装 在Ubuntu系统中安装MySQL 8.0可以通过以下步骤进行1. 更新包管理工具的仓库列表&#xff1a; sudo apt update 2. 安装MySQL 8.0&#xff0c;root用户默认没有密码&#xff1a; sudo apt install mysql-server sudo apt install mysql-client 【…...

解释一下 Java 中的静态变量(Static Variable)和静态方法(Static Method)?

今天来和大家深入探讨一下 Java 中的静态变量和静态方法&#xff0c;并通过一些具体的例子来理解它们在实际开发中的应用。 静态变量&#xff08;Static Variable&#xff09; 静态变量&#xff0c;也称为类变量&#xff0c;是在类的层次上共享的变量。这意味着无论创建了多少…...

【Linux】————磁盘与文件系统

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示&#xff1a; 其中具体的物理存储结构如下&#xff1a; 磁盘中存储的基本单位为扇区&#xff0c;一个扇区的大小一般为512字…...

平衡控制——直立环——速度环

目录 平衡控制原理 平衡控制模型 平衡控制中基于模型设计与自动代码生成技术 速度环应用原理 速度控制模型 平衡控制原理 下图是一个单摆模型&#xff0c;对其进行受力分析如图。 在重力作用下,单摆受到和角度成正比,运动方向相反的回复力。而且在空气中运动的单摆,由于受…...

面试简要介绍hashMap

jdk8之前&#xff0c;hashmap采用的数据结构是数组链表&#xff0c;jdk8之后采用的数据结构是数组链表/红黑树。hashmap的数据以键值对的形式存在&#xff0c;如果两个元素的hash值相同&#xff0c;就会发生hash冲突&#xff0c;被放到同一个链表上--->如何解决hash冲突---&…...

HTTPS如何实现加密以及SSL/TSL加密的详细过程

通过将服务器从 HTTP 提升到 HTTPS 加密&#xff0c;数据在客户端和服务器之间的传输过程中的确得到了安全保护。以下是这种实现加密的机制以及客户端需要做的事情的详细说明。 为什么这样就实现了加密 SSL/TLS 协议&#xff1a; HTTPS 使用 SSL&#xff08;安全套接层&#x…...

Golang | Leetcode Golang题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; func longestPalindromeSubseq(s string) int {n : len(s)dp : make([][]int, n)for i : range dp {dp[i] make([]int, n)}for i : n - 1; i > 0; i-- {dp[i][i] 1for j : i 1; j < n; j {if s[i] s[j] {dp[i][j] dp[i1][j-1] …...

(done) 什么 RPC 协议? remote procedure call 远程调用协议

来源&#xff1a;https://www.bilibili.com/video/BV1Qv4y127B4/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 可以理解为&#xff0c;调用远程服务器上的一个方法/函数/服务的方式&#xff0c;同时隐藏网络细节 一个 python3 …...

PCL 基于Ransac提取误匹配点对

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 基于RANSAC的误匹配点对提出函数 2.1.2 点云可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、…...

光速写作 2.0.5 | 专注AI写作,海量素材库

光速写作是一款专为解决写作难题设计的应用。它具有以下功能&#xff1a;- 「AI写作」&#xff1a;帮助分析题目、整理写作思路&#xff0c;合成作文&#xff0c;写出好文章。- 「作文批改」&#xff1a;拍照上传作文后&#xff0c;进行全文点评和分句点评&#xff0c;并进行全…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...