STL技术概述与入门

STL技术概述与入门

    • STL介绍
    • STL六大组件
    • 初识容器算法迭代器
      • 1. vector存放内置数据类型
      • 2. Vector存放自定义数据类型
      • 3. Vector容器的嵌套
    • ✨ 总结

参考博文1:STL技术——STL概述和入门
参考博文2:<C++>初识STL —— 标准模板库

STL介绍

  • STL(Standard Template Library,标准模板库)
  • STL 从广义上分为: 容器(container)  算法(algorithm)  迭代器(iterator)
  • 容器算法之间通过迭代器进行无缝连接。
  • C++的面向对象泛型编程思想,目的就是复用性的提升

STL六大组件

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

  1. 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
  2. 算法:各种常用的算法,如sort、find、copy、for_each等
  3. 迭代器:扮演了容器与算法之间的胶合剂。
  4. 仿函数:行为类似函数,可作为算法的某种策略。
  5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  6. 空间配置器:负责空间的配置与管理。

初识容器算法迭代器

迭代器种类:

种类功能支持运算
输入迭代器对数据的只读访问只读,支持++、==、!=
输出迭代器对数据的只写访问只写,支持++
前向迭代器读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器读写操作,并能向前和向后操作读写,支持++、–
随机访问迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器读写,支持++、–、[n]、-n、<、<=、>、>=

常用的容器中迭代器种类为双向迭代器和随机访问迭代器

vector容器的初次使用
  STL中最常用的容器为Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器
vector容器迭代器内部结构图:


1. vector存放内置数据类型

容器:  vector
算法;  for_each
迭代器: vector<int>::iterator

(1)创建容器对象v:

#include <vector>vector<int> v;	

(2)向容器中插入数据:

//向容器中放数据
v.push_back(10);
v.push_back(20);
v.push_back(30);

将10、20、30依次尾插入v容器内,插入数据利用push_back方法,然后利用迭代器遍历容器中的数据

(3)遍历数据:

  • 每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素,迭代器相当于数组的下标,但迭代器的类型为 vector<int>::iterator
  • v.begin()返回迭代器,这个迭代器指向容器中第一个数据
  • v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置

遍历方式1

//非常常用的容器遍历方式 必须熟悉
vector<int>::iterator it;	//创建vector容器迭代器
for(it=v.begin(); it!=v.end(); it++)
{cout << *it << endl;
}

创建一个指针即可,也是让指针从begin递增,在不等于end时依次解引用输出数据。这个方法比较常用于遍历容器,我个人推荐使用

*it代表<>内的数据类型,那么其实it就表示<>内数据类型的指针

遍历方式2
同时也可以使用STL中提供的遍历算法,本人用的不多

#include <algorithm>void func(int val)
{cout << val << endl;
}for_each(v.begin(), v.end(), func);

使用for_each循环需要先引入头文件#include <algorithm>,这个头文件包含了算法里的方法。参数列表分别是:起始位置,终止位置,输出函数句柄。

完整测试程序:

//容器存放int数据类型并遍历
void test()
{vector<int> v;				//创建vector容器对象 v//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素//v.begin()返回迭代器,这个迭代器指向容器中第一个数据//v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置//vector<int>::iterator 拿到vector<int>这种容器的迭代器类型//向容器中放数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);cout << "1.容器存放int数据类型并遍历  方式一" << endl;//遍历方式1vector<int>::iterator it;	//创建vector容器迭代器for(it=v.begin(); it!=v.end(); it++){cout << *it << endl;}cout << "1.容器存放int数据类型并遍历  方式二" << endl;//遍历方式2for_each(v.begin(), v.end(), func);
}

2. Vector存放自定义数据类型

 设计一个容器,存放每个学生的姓名和年龄,并通过迭代器方式遍历输出每个学生信息。

(1)自定义数据类型Person

class Person
{
public:string name;int age;Person(string name, int age){this->name = name;this->age  = age;}
};

(2)创建容器v

vector<Person> v;	//创建vector容器对象,存放自定义数据

注意: <>内为容器内存放的数据类型,因此创建的时候需要设置数据类型为Person

(3)向容器中插入数据

	Person p1("张三", 21);Person p2("李四", 22);Person p3("王五", 23);v.push_back(p1);v.push_back(p2);v.push_back(p3);

在插入数据之前,需要实例化对象p1,p2,p3,然后利用push_back方法,插入实例对象数据。

(4)遍历数据

vector<Person>::iterator it;	//定义迭代器
for(it = v.begin(); it != v.end(); it ++)
{// it表示<>内的类型指针 *it代表<>内的数据类型cout << (*it).name << " " << it->age << endl;		
}

  在定义迭代器的时候,因为容器内的数据为Person类型,因此定义的迭代器类型也需要为Person类型。此外因为it为Person类型的指针,因此可以通过 (*it).name 形式访问成员变量,也可以使用指针形式访问成员变量 it->age

完整测试程序:

//2. 容器存放自定义数据
void test()
{vector<Person> v;		//创建vector容器对象,存放自定义数据Person p1("张三", 21);Person p2("李四", 22);Person p3("王五", 23);v.push_back(p1);v.push_back(p2);v.push_back(p3);cout << "2. 容器存放自定义数据并遍历" << endl;	//存放自定义数据 遍历vector<Person>::iterator it;for(it = v.begin(); it != v.end(); it ++){cout << (*it).name << " " << (*it).age << endl;		//*it代表<>内的数据类型//或者 因为it2本质为指针//cout << it->name << " " << it->age << endl;}
}

3. Vector容器的嵌套

  设计一个大容器,大容器中存放不同的小容器,小容器中存放整型数据类型,通过迭代器变量输出,说白了设计个二维数组
(1)创建大容器

vector< vector<int> > v;		//创建大容器,存放小容器

注意: 大容器类型为 vector< vector<int> >,<>内是存放的数据类型,小容器的类型 vector<int>
(2)插入数据

//创建小容器
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);

注意:大容器中插入小容器大致分为三步一是定义不同的小容器,二是往小容器中插入数据,三是将不同的小容器再插入大容器中

(3)遍历数据

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;
}

注意: 因为有大小容器之分,所以要定义一个 vector< vector<int> > 类型的大容器迭代器 it 和一个 vector<int> 类型的小容器迭代器 vit,并且使用循环的嵌套,说白了就是遍历个二维数组。需要重视的是,*it 和 *vit 表示的数据类型,*it 表示vector类型。

完整测试程序:

//4. 容器嵌套容器  容器~=数组    容器嵌套 ~= 二维数组
void test04()
{//创建大容器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);//循环遍历cout << "循环遍历大小容器内数据" << endl;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;}
}

✨ 总结

  到这里STL技术概述与入门就结束了,跟着这篇博客学习可以了解STL的基本概念,以及STL六大组件中容器、算法、迭代器的关系,并且主要熟悉容器的创建、插入数据及其遍历容器的例程,后面的内容也会持续更新,希望朋友们多多支持,你们的鼓励是我创作的不竭动力✨

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

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

相关文章

SpringBoot配置mysql加密之Druid方式

一、导入Druid依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version> </dependency>二、生成密文 方式1. 找到存放druid jar包的目录 1-1、在目录…

【Proteus仿真】【Arduino单片机】电子称重秤

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;矩阵按键、蜂鸣器、HX711称重模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示HX711称重模块检测重量…

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先&#xff0c;我们先来说下什么是人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理&#xff0c;使其能够感知环境、理解和…

怎么检测DC-DC电源模块稳定性?电源测试系统测试有什么优势?

DC-DC电源模块稳定性测试 稳定性是衡量DC电源模块的重要指标&#xff0c;电源模块的稳定性直接影响着电源产品和设备的工作稳定性。DC-DC电源模块的稳定性&#xff0c;可以通过检测输出电压、输出电流、负载、波形、效率等参数来评估。 1. 静态测试方法 静态测试是通过直流电压…

【DataSophon】大数据服务组件之Flink升级

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

性能测试QPS+TPS+事务基础知识分析

事务 就是用户某一步或几步操作的集合。不过&#xff0c;我们要保证它有一个完整意义。比如用户对某一个页面的一次请求&#xff0c;用户对某系统的一次登录&#xff0c;淘宝用户对商品的一次确认支付过程。这些我们都可以看作一个事务。那么如何衡量服务器对事务的处理能力。…

部署智能合约以及 javascript 调用合约函数(Web3项目二实战之三)

在上一篇 智能合约是Web3项目的核心要务(Web3项目二实战之二) ,我们已然为项目编写了智能合约,在攥写完智能合约后,该项目将完成了一大部分,剩下无非就是用户界面交互的内容。 然而,在码完了智能合约代码后,起着承前启后关键性的便是,前端界面与智能合约的交互。 智能…

ansible远程操作主机功能(1)

自动化运维&#xff08;playbook剧本yaml&#xff09; 是基于Python开发的配置管理和应用部署工具。自动化运维中&#xff0c;现在是异军突起。 Ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c;类似于Xshell的一键输入的工具&#xff0c;不需要每次…

【IOS开发】传感器 SensorKit

资源 官方文档 https://developer.apple.com/search/?qmotion%20graph&typeDocumentation SensorKit 使应用程序能够访问选定的原始数据或系统从传感器处理的指标。 步骤信息加速度计或旋转速率数据用户手腕上手表的配置物理环境中的环境光有关用户日常通勤或旅行的详细…

实验用python实现决策树和随机森林分类

1.实验目的 1.会用Python提供的sklearn库中的决策树算法对数据进行分类 2.会用Python提供的sklearn库中的随机森林算法对数据进行分类 3.会用Python提供的方法对数据进行预处理 2.设备与环境 使用Spyder并借助Python语言进行实现 3.实验原理 决策树( Decision Tree) 又称为…

【论文解读】Kvazaar 2.0: Fast and Efficient Open-Source HEVC Inter Encoder

时间&#xff1a;2020 级别&#xff1a;SCI 机构&#xff1a;Tampere University 摘要&#xff1a;高效视频编码(HEVC)是当前多媒体应用中经济的视频传输和存储的关键&#xff0c;但解决其固有的计算复杂性需要强大的视频编解码器实现。本文介绍了Kvazaar 2.0 HEVC编码器&…

RDD编程

目录 一、RDD编程基础 &#xff08;一&#xff09;RDD创建 &#xff08;二&#xff09;RDD操作 1、转换操作 2、行动操作 3、惰性机制 &#xff08;三&#xff09;持久化 &#xff08;四&#xff09;分区 &#xff08;五&#xff09;一个综合实例 二、键值对RDD &am…

SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

系列文章&#xff1a; SpringBoot Vue前后端分离项目实战 || 一&#xff1a;Vue前端设计 SpringBoot Vue前后端分离项目实战 || 二&#xff1a;Spring Boot后端与数据库连接 SpringBoot Vue前后端分离项目实战 || 三&#xff1a;Spring Boot后端与Vue前端连接 SpringBoot V…

【老牌期刊】IF:12,持续飙升,同领域期刊中的“佼佼者“,国人友好!

01 期刊概况 ARTIFICIAL INTELLIGENCE REVIEW ​ 【出版社】Springer 【ISSN】0269-2821 【EISSN】1573-7462 【检索情况】SCI&EI&Scopus在检 【WOS收录年份】1988年 【出刊频率】双月刊&#xff0c;最新一期December 2023 【期刊官网】 https://link.springe…

【Linux】进程周边005之环境变量

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.环境变量是什么&#xff1…

太阳能电池效能IV测试PV检测太阳光模拟器

目录 概述 一、系统组成 产品特点&#xff1a; 技术参数 数字源表 本系统支持Keithley24xx系列源表 标准太阳能电池 低阻测试夹具 自动化测试软件 概述 太阳能光伏器件的所有性能表征手段中&#xff0c;IV特性测试无疑是最直观、最有效、最被广泛应用的一种…

【OS】操作系统总复习笔记

操作系统总复习 文章目录 操作系统总复习一、考试题型1. 论述分析题2. 计算题3. 应用题 二、操作系统引论&#xff08;第1章&#xff09;2.1 操作系统的发展过程2.2 操作系统定义2.3 操作系统的基本特性2.3.1 并发2.3.2 共享2.3.3 虚拟2.3.4 异步 2.4 OS的功能2.5 OS结构2.5 习…

Android studio 按键控制虚拟LED

一、activity_main.xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.a…

《Linux C编程实战》笔记:进程操作之创建进程

进程是一个动态的实体&#xff0c;是程序的一次执行过程。进程是操作系统资源分配的基本单位。 以下是一些概念&#xff0c;我就直接抄书了 进程是操作系统的知识&#xff0c;简单理解的话&#xff0c;你写的代码运行起来算一个进程&#xff1f; 创建进程 每个进程由进程ID号…

GPT-4.5!!!

GPT-4 还没用明白&#xff0c;GPT-4.5 就要发布了。 最近&#xff0c;OpenAI 泄露了 GPT-4.5 的发布页面&#xff0c;除了进一步增强复杂推理和跨模态理解&#xff0c;GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持&#xff0c;也就意味着多模态最后一块版图…