【C++】STL

news2024/11/17 22:36:19

文章目录

  • 回调函数:
  • 一、STL的诞生
  • 二、STL基本概念
  • 三、STL六大组件
  • 四、STL中容器,算法,迭代器

回调函数:

  • 函数被作为参数传递到另一个函数(主要函数)的那个函数就叫做 回调函数

一、STL的诞生

  • C++的面向对象和泛型编程思想,目的就是复用性的提升
  • 大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
  • 为了建立数据结构和算法的一套标准,诞生类STL

二、STL基本概念

  • STL(Standard Template Library,标准模板库)
  • STL从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接。
  • STL几乎所有的代码都采用了类模板或模板函数。

三、STL六大组件

STL大体分为六大组件,分别是:容器,算法,迭代器,仿函数,适配器(配接器),空间配置器

  • 容器:各种数据结构,用来存放数据

    • string(字符串)
    • vector(单端数组)(动态扩展,尾部插入删除,支持随机存取)
    • deque(双端数组)(头尾插入删除,中控器)
    • stack(单出口栈)(先进后出,一个头部出口,不许遍历)
    • queue(队列)(先进先出,队头出队尾入(两个接口),不许遍历)
    • list(链表)(非连续存储结构,不支持随机存取,快速插入删除,可以遍历)
    • set(集合)
    • map(映射表)
  • 算法:各种常用的算法,如sort(排序)、find(查找)、copy(拷贝)、for_each(遍历)等

  • 迭代器:扮演了容器和算法之间的胶合剂

  • 仿函数:行为类似函数,可作为算法的某种策略(重载())

  • 适配器:用来修饰(容器或者仿函数或迭代器)接口的东西 (多个参数传递的接口)

  • 空间配置器:负责空间的配置与管理 (有些数据开辟到堆区,手动开辟手动释放)

四、STL中容器,算法,迭代器

1、容器:置物之所也

  • STL容器就是将运用最广泛的一些数据结构实现出来
  • 常用的数据结构:数组,链表,树,栈,队列,集合,映射表等

(1)容器分为序列式容器和关联式容器两种:

  • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置(怎么放,位置就固定了)
  • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系(放的同时做了一个排序)

2、算法:问题之解法也

  • 有限的步骤,解决逻辑或数学上的问题,叫做算法(Algorithms)

(1)算法分为:质变算法和非质变算法

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

3、迭代器:容器和算法之间粘合剂

  • 算法要通过迭代器才能访问容器中的元素
  • 每个容器都有自己专属的迭代器
  • 迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
  • 提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。

(1)常用的容器中迭代器的种类为双向迭代器,和随机访问迭代器。
在这里插入图片描述

#include<iostream>
using namespace std;
 
#include<vector> //stl每次使用都要包含头文件
#include<algorithm>//标准算法头文件
 
//vector容器存放内置数据类型
 
void myPrint(int val)
{
    cout << val << endl;
}
 
void test01()
{
    //创建了一个vector容器,数组
    //<>中是要操作的数据类型,v为容器名(对象名),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;//*it就是<>中内容
    }
 
    //第三种遍历方式 利用STL中提供的遍历算法
    //写函数名就行,利用了回调的技术
    //(一开始不调用,在遍历期间再来调用)
    for_each(v.begin(), v.end(), myPrint);//函数名相当于指向函数的指针 
 }
 
int main()
{
    test01();
 	system("pause");
    return 0;
}
#include<iostream>
#include< string>
#include< vector>
#include< algorithm>//标准算法头文件

using namespace std;

//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("aa", 10);
    Person p2("asa", 120);
    Person p3("ada", 120);
    Person p4("faa", 110);
    Person p5("aqa", 170);
 
    //向容器中添加数据
    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++)
    {                      //*it的数据类型看<>内的
        cout << "姓名: " << (*it).m_Name << " 年龄为: " << (*it).m_Age << endl;
        cout << "姓名: " << it->m_Name<< " 年龄为: " << it->m_Age<< endl;
    }
}
 
//存放自定义数据类型 指针
void test02()
{
    vector< Person*> v;
 
    Person p1("aa", 10);
    Person p2("asa", 120);
    Person p3("ada", 120);
    Person p4("faa", 110);
    Person p5("aqa", 170);
 
    //向容器中添加数据
    v.push_back(&p1);
    v.push_back(&p2);
    v.push_back(&p3);
    v.push_back(&p4);
    v.push_back(&p5);
 
    //遍历容器    //*it解出的是Person类型的指针,即(*it)是指针(地址)
    for (vector< Person*>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << "::姓名: " << (*it)->m_Name << " 年龄为: " << (*it)->m_Age << endl;
    }
}
int main()
{
    test01();
    test02();
    system("pause");
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60697.html

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

相关文章

DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0

Diagram — JavaScript/HTML5 Diagram Library Ω578867473 破解版DHTMLX Diagram comprises a set of interactive HTML5 UI components such as organization charts, flowcharts, decision trees, block diagrams, mind maps, etc. Consisting of nodes and connectors, di…

i.MX 6ULL 驱动开发 二十八:网络设备

一、网络设备的系统框图 MAC&#xff1a;工作在网络模型的数据链路层&#xff0c;通过 RGMII 或 RMII 接口连接 PHY&#xff0c;MAC 控制器中的 MDIO 控制器提供 MDIO 接口&#xff0c;用于访问 PHY 寄存器。 PHY&#xff1a;工作在网络模型的物理层&#xff0c;是 IEEE802.3 …

SVN项目,提交Git保留之前提交记录

&#x1f4c3;目录跳转简介&#xff1a;1.创建文件2.命令下载:3.上传到远程git3.1 创建远程git工程3.2 添加一个新的远程 Git 仓库3.3 拉取远程master的数据合并3.3 推送远程git分支简介&#xff1a; 由于之前直接搞的项目是部署在自己搭建的SVN服务器上&#xff0c;平时创建的…

5. JVM调优工具详解及调优实战(这里有我的实战案例预制构件生产管理平台)

1. Jmap&#xff0c;Jstack&#xff0c;Jinfo命令详解 1.1 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jps 先查看有哪些java程序 jmap -histo 16492 > ./log.txt jmap -heap 16492 查看堆的信息 查看堆年轻代老年代的使用情况 堆内存dum…

Matlab:tftb-0.2时频工具箱安装小记

Matlab&#xff1a;tftb-0.2时频工具箱安装小记一、安装过程记录1、解压缩&#xff1a;2、将解压缩后的文件夹复制到自己的Matlab安装目录工具箱下&#xff1b;3、打开Matlab设置路径&#xff1a;设置路径4、测试是否安装成功&#xff1a;5、小试牛刀叮嘟&#xff01;这里是小啊…

【ASE+python学习】-批量识别石墨烯团簇结构中的吡啶氮,并删除与其相连的氢

批量识别石墨烯团簇结构中的吡啶氮&#xff0c;并删除与其相连的氢文章背景任务内容程序实现思路实现代码建立标准结构中边缘碳与氢的位置差值标准数据集读入待修改结构&#xff0c;识别氮与氢位置差值是否存在标准数据集代码细节剖析文章背景 在科研工作中&#xff0c;我的工…

STM32系列(HAL库)——串口IAP

前言 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c;IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写&#xff0c;目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 设备具备IAP功能…

javaScript学习———变量概述 变量的使用 变量语法扩展 变量命名规范交换 变量案例

博主每篇博文的浪漫主义&#xff1a; 【东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;】 https://www.bilibili.com/video/BV1pG411F7KT/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;…

计算机组成原理--------12.4---------开始

计算机硬件的基本组成 冯诺依曼计算机的特点 冯诺依曼首次提出“存储程序”概念 计算机由五大部件组成&#xff1a;I/O设备&#xff08;输入输出&#xff09;&#xff0c;存储器&#xff08;存放数据和程序&#xff09;&#xff0c;运算器&#xff08;算术运算、逻辑运算&…

[附源码]JAVA毕业设计科研项目审批管理系统(系统+LW)

[附源码]JAVA毕业设计科研项目审批管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

关于解释型语言和编译性语言的区别

关于博主每篇博文的浪漫主义 【初恋是整遍《手写的从前》】 https://www.bilibili.com/video/BV1JP411g7qF/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 初恋是整遍《手写的从前》能够知道解释性语言和编译型语言的特点能够知道标识符不能是关键字…

docker_重装mysql

1.docker ps 查看docker正在运行的容器 2.docker stop xxx 停止正在运行的mysql 3.docker pull mysql:5.7 docker拉取mysql指定版本的镜像 docker pull mysql docker拉取最新版本的镜像 4.docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:…

PHP代码审计系列(一)

PHP代码审计系列&#xff08;一&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 extract变量覆盖 源码如下 <?php$flagextractFlag.txt; extract($_GET);if(isset($shiyan)){ $contenttrim(f…

YOLO算法创新改进系列(项目汇总)

&#x1f680;&#x1f680;&#x1f680;——YOLO算法创新改进系列项目汇总——&#x1f384;&#x1f384;&#x1f384; &#x1f680; YOLO算法创新改进系列 &#xff08;项目汇总&#xff09;&#x1f384;&#x1f388; &#x1f340; 改进YOLOv5/YOLOv7——魔改YOLOv5/Y…

文件操作及IO

目录 一、文件的分类 二、文件路径 三、File 常见方法 1、get 相关方法使用 2、文件的创建和删除 3、遍历目录下所有文件 四、文件读写 一、文件的分类 站在程序员的角度&#xff0c;文件通常可以分为两类&#xff1a; 文本文件&#xff1a;以字符形式存储二进制文件&…

Java基于SSM的海淘商城系统

随着计算机网络的普及,电子商务的兴起,网络支付以及网络安全体系逐渐完善,人们的生活进入了网络时代,越来越多的人习惯于乐于网上购物,只需上网轻轻点击鼠标便能够买到心仪商品。 本系统主要是针对广大网络消费者而开发的,专为网络消费者打造,建设一个”全球购”海淘商城系统。…

Redis学习笔记(五)

主从复制 单机redis的风险和问题 机器故障&#xff1a;硬盘故障、系统崩溃容量瓶颈&#xff1a;内存不足&#xff0c;无限升级内存结论&#xff1a;为了避免单点redis服务器故障&#xff0c;准备多台服务器互相连通&#xff0c;将数据复制多个副本保存在不同的服务器上&#xf…

Vue 官方文档2.x教程学习笔记 1 基础 1.5 计算属性和侦听器 1.5.2 侦听器

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.5 计算属性和侦听器1.5.2 侦听器1 基础 1.5 计算属性和侦听器 1.5.2 侦听器 虽然计算属性在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器。 这就是为什么 Vue 通过 watch 选项提…

图像处理:模糊图像判断

目录 上期回顾 采用Laplace算子的原因 实现的效果 图片素材 代码的展示与讲解 效果展示 项目资源 上期回顾 上一次的图像清晰度评价没有成功&#xff0c;主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解&#xff0c;不同的场景灰度的明暗不同&#xff0c;…

数据结构栈的实现

目录栈的概念栈的结构声明初始化数据入栈出栈判断栈是否为空取栈顶的值销毁栈栈的概念 栈是一种线性表&#xff0c;插入数据的一端叫栈顶&#xff0c;另一端叫栈底。 入栈&#xff1a;数据从栈顶进入栈中 出栈&#xff1a;数据从栈顶删除 所以&#xff0c;栈的特点就是先进后出…