C++中的STL

STL(标准模板库)在广义上分为:容器,算法,迭代器

容器和算法之间通过迭代器进行无缝衔接

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

  1. 容器:各种数据结构
  2. 算法:各种常用的算法
  3. 迭代器:扮演了容器和算法间的桥梁
  4. 仿函数:行为类似函数
  5. 适配器:修饰容器或者仿函数或者迭代器接口的东西
  6. 空间配置器:负责空间的配置和管理

1.实例

头文件:#include<vector>

容器:vector : 语法:vector<数据类型> 容器名;

方法:插入数据:容器名.push_back(数据);

迭代器:

vector<int>::iterator itBegin = v.begin();//定义起始迭代器,指向容器的第一个位置
vector<int>::iterator itEnd = v.end(); //结束迭代器,指向容器最后一个元素的下一个位置

2.string容器

string是一个类,类内部封装了char*,并且封装了多个成员方法

构造函数
  • string():构造一个空的字符串 如:string str;
  • string(const char *s):使用字符串s来初始化·
  • string(const string &str)使用另一个string来初始化这个string对象
  • string(int n,char c)使用n个c来初始化对象
赋值操作

方法1
void test01()
{
    string str1;
    str1 = "hello world"
}

方法2
void test01()
{
    string str2;
    str2 = str1;
}

方法3
void test01()
{
    string str3;
    str3 = 'a';
}

方法4
void test01()
{
    string str4;
    str4.assgin("hello world");
}

方法5
void test01()
{
    string str5;
    str5.assgin("hello world",5);
}


方法6
void test01()
{
    string str6;
    str6.assgin(str5);
}


方法7
void test01()
{
    string str7;
    str7.assgin(5,'x');
}

字符串拼接

void text01()
{
    string str1 = "wjm";
    str1 += "041006";
}

void text01()
{
    string str2 = "wjm04100";
    str1 += '6';
}

void text01()
{
    string str3 = "041006";
    str1 += str3;
}

剩下的使用append进行追加不具例子
和上面使用assgin进行赋值操作相差不大
 查找与替换

查找
void test01()
{
    string str1 = "wjm041006";
    str1.find("04");//返回从零开始计数的初始位置,没有的话返回 -1
}

rfind同find的区别

rfind从右向左查找
find从左向右查找

替换操作
void test01()
{
    string str1 = "wjm041006";
    str1.replace(0,2,"wwww");
}

//这个的输出结果为wwww041006
 字符串比较

= 返回0

> 返回1

< 返回 -1

void test01()
{
    string str1 = "hello";
    string str2 = "hello";
    cout << str1.compare(str2) << endl;
}

//输出0;
//介绍一下字符串比较规则
//从第一个字符开始向后比较,如果两个字符对应位置相等,继续向后比较
//如果不相等,那么根据ascll值进行比较
string字符的存取 

上面的方法同数组类似

下面的通过at方法

void test01()
{
    string str1 = "wjm041006"
    cout<<str1.at(0)<<endl;
}

//输出w
插入与删除

void test01()
{
    string str = "wjm041006";
    str.insert(1,"www");
    str.erase(1,3);
}

//输出结果为wjm041006
子串获取 

函数原型

string substr(int pos = 0,int n = npos)const;
void test01()
{
    string str = "wjm041006";
    string substr = str.substr(0,2);
    cout<<substr<<endl;
}

//输出结果为wjm

3.vector容器

vector数据结构和数组非常类似,也称为单端数组

不同之处在于vector可以动态扩展

其动态扩展并不是在原空间之后续接新空间,而是寻找更大的内存空间进行拷贝,随后释放原空间

构造函数 

void test01()
{
    vector<int> v1;
    vector<int> v2(v1.begin(),v1.end());
    vector<int> v3(10,100);//前面表示个数,后面表示值
    vector<int> v4(v3);
}
 赋值操作

void test01()
{
    vector<int> v1;
    for(int i=0;i<10;i++) v1.push_back(i);
    
    vector<int> v2;
    v2 = v1;

    vector<int>v3;
    v3.assgin(v1.begin(),v1.end());

    vector<int> v4;
    v4.assgin(10,100);
}
容量和大小

void test01()
{
    vector<int> v1;
    for(int i=0;i<10;i++) v1.push_back(i);
    
    if(v1.empty()) cout<<"v1为空"<<endl;
    cout<<"v1的容量"<<v1.capacity()<<endl;
    cout<<"v1的大小"<<v1.size()<<endl;
    v1.resize(15);
    cout<<"v1的大小"<<v1.size()<<endl;//默认以0填充新的位置
}
插入和删除

void test01()
{
    vector<int> v1;
    for(int i=0;i<10;i++) v1.push_back(i);
    v1.pop_back();//删除尾部元素
    v1.insert(v1.begin(),100);//第一个参数为迭代器,第二个为数值
    v1.erase(v1.begin());//删除迭代器位置元素
    v1.clear();
}

 note:vector   insert方法使用的为迭代器,string为位置

数据存取

vector的数据存取同string类似

互换容器swap

功能为实现两个容器内元素进行互换

代码非常简单 v1.swap(v2);

当重新指定容器大小的时候,可能由于之前使用的容量大造成容量浪费

使用

vector<int> (v1).swap(v1);

可以重新分配容量

预留空间

减少vector在动态容量扩展中的次数

v.reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问

deque容器

双端数组,可以进行头部的插入和删除操作

为什么deque可以进行双端插入呢?

在于其内部存在一个中控器,存放各个缓冲区的地址,然后缓冲区存放真实数据,这样使得deque看起来像连续的内存空间,但其访问速度要相对vector慢上一些,原因在于其要先找到对应缓冲区的地址,然后再访问数据

构造函数

void test01()
{
    deque<int>d1;
    deque<int>d2(d1.begin(),d1.end());
    deque<int>d3(10,100);
    deque<int>d4(d3);
}

deque的其余操作基本同vector一致

 

deque没有容量的概念

deque可以进行头插,头删和尾插,尾删

其余插入删除操作和vector类似

stack栈式容器

特点

先进后出,只有一个出口,只在顶部进出,因为只有栈顶元素才可以被外界访问到,所以不可以进行遍历,但是可以判断容器是否为空,以及其中元素数目

入栈:push

出栈:pop

举个例子,弹匣,只能从顶端往里面放,顶端弹出,然后每次使用的是最上的一颗子弹

常用接口

void test01()
{
    stack<int> s;
    s.push(1);
    s.push(2);
    
    if(!s.empty())
    {
        cout<< "栈顶元素:"<<s.top()<<endl;
        s.pop();
    }
    cout<<"栈的大小:"<<s.size()<<endl;
}

queue队列容器

遵循规则:先进后出,存在两个出口,但是出去只能从队首出,进入从队尾进入

只有队首和队尾才可以被外界访问到,因此队列也不允许有遍历行为

数据进入叫入队 push

数据出去叫出队 pop

其方法同stack栈相差不大,这里就不多做介绍了

list链表

功能:将数据进行链式存储

链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

链表由一系列节点组成

包含两个域:分别为存储数据元素的数据域以及下一个结点地址的指针域

STL中给提供的链表是一个双向循环链表

存在两个指针域,一个指向前面的结点,一个指向后面的结点,同时最后一个结点指向第一个结点

链表中的迭代器只会支持前移和后移,属于双向迭代器

构造函数

void test01()
{
    list<int> L1;
    
    L1.push_back(10);
    L1.push_back(20);
    

    list<int>L2(L1.begin(),L2.begin);
    list<int>L3(L2);
    list<int>L4(10,1000);
}

 list构造方式同其余容器的方式基本一致

赋值和交换

大小操作

插入和删除

 这里注意pos代表的是迭代器,同时新增方法remove,此方法是可以移除容器中所有域elem相同的元素

list的反转和排序

bool myCompare(int v1,int v2) { return v1>v2; }

void test01()
{
    list<int>  l1;
    l1.push_back(10);
    l1.push_back(20);
    l1.push_back(40);
    l1.push_back(30);

    //反转操作
    l1.reverse();
    l1.sort();//默认为从小到大
    l1.sort(myCompare);

}

note:所有不支持随机访问迭代器的容器,不可以使用标准算法,内部会存在一些算法

set/multiset集合容器

所有元素都会再插入时自动被排序

均属于关联式容器,底层结构是用二叉树实现

set中不允许存在重复的元素,multiset允许容器存在重复的元素

set构造函数提供两种构造方法

默认构造函数:set<T> st;

拷贝构造函数:set(const set &st);

赋值操作:重载等号运算符。

note:插入数据仅有insert方式

使用size()判断容器中元素的数据

empty() 判断容器是否为空

swap(st) 交换两个集合容器

set容器的删除操作

 set容器的查找与统计

 对于set而言,统计的结果要么是0,要么是1

对组

pair<string,int>p("Tom",20);

p.first//取出第一个数据
p.second//取出第二个数据

pair<string,int>p = make_pair("Tom",20);
改变set容器排序规则

 利用仿函数

//set容器排序

class mycompare
{
public:
    bool operator()(int v1,int v2)
    { return v1>v2; }
}


void test01()
{
    set<int,mycompare> s1;
    
    s1.insert(10);
    s1.insert(20);
    s1.insert(30);
    s1.insert(40);

    //指定排序规则,需要在还没有插入数据的时候确定排序规则
    
}

map元组

map中元素都是键值对

第一个元素为键值,起到一个索引的作用

第二个元素为实值

所有元素回按照元素的键值进行自动排序,底层使用二叉树实现

优点在于可以根据key值快速找到value值

map容器不允许容器存在重复的key元素

构造包括默认构造和拷贝构造

赋值还是重载了等号运算符

void test01()
{
    map<int,int> m;
    m.insert(pair<int,int>(1,10));
    m.insert(pair<int,int>(2,20));
    m.insert(pair<int,int>(3,30));
    m.insert(pair<int,int>(4,40));
   
    //迭代器访问
    map<int,int>::iterator it = m.begin();
    it -> first;//访问key
    it -> second;//访问value
}

查找,统计,插入,删除与set类似,这里不做介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下安装和配置Go开发环境

文章目录 1. 介绍了SDK2. 下载 SDK工具包3. windows 下配置 Golang 环境变量 1. 介绍了SDK SDK 的全称(Software Development Kit 软件开发工具包)SDK是提供给开发人员使用的&#xff0c;其中包含了对应开发语言的工具包 2. 下载 SDK工具包 Go语言的官网为&#xff1a;https…

riscv架构下linux4.15实现early打印

在高版本linux6.12.7源码中&#xff0c;early console介绍&#xff0c;可参考《riscv架构下linux6.12.7实现early打印》文章。 1 什么是early打印 适配内核到新的平台&#xff0c;基本环境搭建好之后&#xff0c;首要的就是要调通串口&#xff0c;方便后面的信息打印。 正常流…

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载 效果展示 使用方法 import LoadingText from "../components/LoadingText" import PageToRefresh from "../components/PageToRefresh" import FooterBar from "../components/…

《自动驾驶与机器人中的SLAM技术》ch9:自动驾驶车辆的离线地图构建

目录 1 点云建图的流程 2 前端实现 2.1 前端流程 2.2 前端结果 3 后端位姿图优化与异常值剔除 3.1 两阶段优化流程 3.2 优化结果 ① 第一阶段优化结果 ② 第二阶段优化结果 4 回环检测 4.1 回环检测流程 ① 遍历第一阶段优化轨迹中的关键帧。 ② 并发计算候选回环对…

鸿蒙面试 2025-01-10

写了鉴权工具&#xff0c;你在项目中申请了那些权限&#xff1f;&#xff08;常用权限&#xff09; 位置权限 &#xff1a; ohos.permission.LOCATION_IN_BACKGROUND&#xff1a;允许应用在后台访问位置信息。 ohos.permission.LOCATION&#xff1a;允许应用访问精确的位置信息…

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …

Unreal Engine 5 C++ Advanced Action RPG 七章笔记

第七章 Ranged Enemy 2-Ranged Enemy Starting Weapon 制作新敌人的流程准备 新敌人的武器起始的状态数据自己的战斗能力投射能力自己的行为树 创建角色,添加武器,添加数据,就是继承之前的基类敌人的 运行结果 3-Glacer Starting Stats 看看就行,就是复制曲线表格更改数…

funcaptcha手势指向验证码识别

注意&#xff0c;本文只提供学习的思路&#xff0c;严禁违反法律以及破坏信息系统等行为&#xff0c;本文只提供思路 如有侵犯&#xff0c;请联系作者下架 本文滑块识别已同步上线至OCR识别网站&#xff1a; http://yxlocr.nat300.top/ocr/other/21 该验证码会给出某物品所有的…

GAMES101学习笔记(三):Rasterization 光栅化(三角形的离散化、抗锯齿、深度测试)

文章目录 视口变换 Viewport三角形网格 Triangle Mesh采样 Sampling走样/反走样 Aliasing/Antialiasing采样频率、空间域与频率域深入理解采样、走样、反走样反走样总结深度测试 Depth testing 课程资源&#xff1a;GAMES101-现代计算机图形学入门-闫令琪 Lec5 ~ Lec6 学习笔记…

vscode 扩展Cline、Continue的差别?

Cline和Continue都是VSCode的AI编程插件&#xff0c;它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别&#xff1a; 一、功能差异 编辑功能 Cline&#xff1a;能够分析项目的文件结构和源代码抽象语法树&#xff08;AST&#xff09;&#xff0c;通…

鸿蒙打包发布

HarmonyOS应用/元服务发布&#xff08;打包发布&#xff09; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥&#xff1a;包含非对称加密中使用的公钥和私钥&#xff0c;存储在密钥库文件中&#xff0c;格式…

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

sparkRDD教程之必会的题目

1.前期准备 &#xff08;1&#xff09;看看上一期的博客&#xff0c;最好跟着上一期的博客把sparkRDD的基本命令给熟练掌握后&#xff0c;再来做这篇文章的任务。 上一期的博客&#xff1a;sparkRDD教程之基本命令-CSDN博客 &#xff08;2&#xff09;新建文件task6.scala …

stack和queue专题

文章目录 stack最小栈题目解析代码 栈的压入弹出序列题目解析代码 queue二叉树的层序遍历题目解析代码 stack stack和queue都是空间适配器 最小栈 最小栈的题目链接 题目解析 minst是空就进栈&#xff0c;或者是val < minst.top()就进栈 代码 class MinStack { public:M…

欧拉路径算法

欧拉图&#xff1a; 对于应该连通图G&#xff0c;有&#xff1a; 1欧拉路径&#xff1a;一条路径&#xff0c;它能够不重复地遍历完所有的边&#xff0c;这个性质很像不重复地一笔画完所有边&#xff0c;所以有些涉及到欧拉路径的问题叫做一笔画问题。 2欧拉回路&#xff1a…

【C#设计模式(23)——模板方法模式(Template Method Pattern)】

前言 在抽象类中封装算法的结构&#xff0c;具体的实现步骤由子类定义&#xff0c;从而达到不改变算法结构的&#xff0c;允许子类重定义方法内容。代码 public abstract class Teamplate {public void TeamplateMethod(){Step1();Step2();Step3();}protected abstract void …

MyBatis——XML映射文件

在MyBatis中&#xff0c;既可以通过注解的方式配置SQL语句&#xff0c;也可以通过XML映射文件的方式配置SQL语句。对于简单的SQL语句建议直接通过注解的方式配置SQL语句&#xff1a; Delete("delete from user where id#{id}") Integer deleteById(Integer id);但是…

Mysql--运维篇--安全性(数据库访问控制,最小权限原则,表空间加密,TLS加密,证书签发,SQL注入及防范等)

一、数据库访问控制 MySQL的访问控制是确保数据库安全的关键机制之一。通过合理的用户权限管理和访问控制策略&#xff0c;可以防止未经授权的用户访问、修改或删除敏感数据。 1、MySQL访问控制的工作原理 MySQL使用基于用户的访问控制模型&#xff0c;每个用户都有特定的权…

抽奖滚动功能

代码 <template><div class"box"><video class"video" src"../../assets/video/底层.mp4" loop autoplay muted></video><img class"choujiang" src"../../assets/image/抽奖1.png" alt"&…

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行&#xff08;GUI模式&#xff09;2、通过命令行执行&#xff08;非GUI模式&#xff09; 小知识&#xff1a;…