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;//访问keyit -> second;//访问value
}

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

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

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

相关文章

STL之VectorMapList针对erase方法踩坑笔记

前沿 如下总结的三种容器&#xff0c;开头都会涉及当前容器的特点&#xff0c;再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器&#xff0c;存储内存是连续&#xff0c;且特点支持快速访问&#xff0c;但是插入和删除效率比较地(需要找查找和移动)。另…

hive迁移后修复分区慢,怎么办?

我有1个30TB的分区表&#xff0c;客户给的带宽只有600MB&#xff0c;按照150%的耗时来算&#xff0c;大概要迁移17小时。 使用hive自带的修复分区命令&#xff08;一般修复分区比迁移时间长一点&#xff09;&#xff0c;可能要花24小时。于是打算用前面黄大佬的牛B方案。 msck …

Unity shader中真的可以动态关闭Stencil Test吗?

这个问题很多年前就有人问了&#xff1a; https://discussions.unity.com/t/how-to-disable-the-stencil-block-via-shader-properties/600273/1 最后的答案是&#xff1a; set [_StencilComp] to CompareFunction.Disabled to disable the Stencil Op completely. 但是我测试…

智能化植物病害检测:使用深度学习与图像识别技术的应用

植物病害一直是农业生产中亟待解决的问题&#xff0c;它不仅会影响作物的产量和质量&#xff0c;还可能威胁到生态环境的稳定。随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;尤其是深度学习和图像识别技术的应用&#xff0c;智能化植物病害检测已经成为一…

(十)ROS的常用组件——rosbag和rqt工具箱

前言 主要介绍以下ROS的一些工具的使用后续也要用到。 一、rosbag 机器人传感器获取到的信息&#xff0c;有时我们可能需要时时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如:机器人导航实现中&#xff0c;可能需要绘制导航所需的全局地图&…

抓包之使用抓包来验证TCP三次握手

写在前面 本文看下如何使用抓包的方式来验证TCP的三次握手的过程&#xff0c;关于tcp三次握手详细参考这篇文章。 1&#xff1a;tcpdump抓包验证 [rootlocalhost test]# tcpdump -i lo -c 3 -S tcpdump: verbose output suppressed, use -v[v]... for full protocol decode …

源码安装httpd2.4

1、下载 wget https://archive.apache.org/dist/httpd/httpd-2.4.54.tar.gz 2.解压下载压缩包 tar -zxvf httpd-2.4.54.tar.gz cd httpd-2.4.54 3、安装httpd所需要的依赖 yum groupinstall "Development Tools" -y 4.配置httpd ./configure --prefix/usr/local/htt…

计算机的错误计算(二百一十一)

摘要 用大模型计算 一个模型给出了 Python代码&#xff0c;运行后&#xff0c;有7位错误数字&#xff1b;另外一个模型通过化简&#xff0c;得到了3位正确数字。 例1. 计算 下面是与一个大模型的对话。 上面是与一个大模型的对话。 下面是与另外一个大模型的对话。 点评&…

【C语言】字符串函数详解

文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现&#xff08…

【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)

2025 4th International Conference on Materials Engineering and Applied Mechanics 重要信息 大会官网&#xff1a;www.icmeaae.com 大会时间&#xff1a;2025年3月7-9日 大会地点&#xff1a;中国西安 截稿时间&#xff1a;2025年1月24日23:59 接受/拒稿通知&#xf…

ANSYS Fluent学习笔记(七)求解器四部分

16.亚松弛因子 Controls面板里面设置&#xff0c;它能够稳定计算的过程。如果采用常规的迭代算法可能结果就会发生振荡的情况。采用亚松驰因子可以有助于残差的稳定。 他的取值范围是0-1&#xff0c;0代表没有亚松驰&#xff0c;1表示物理量变化很快&#xff0c;一般情况下取…

【Docker】保姆级 docker 容器部署 MySQL 及 Navicat 远程连接

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. docker 容器部署 MySQL1.1 拉取mysql镜像1.2 启动容器1.3 进入容器1.4 使用 root 用户登录 2. Navicat 连…

LeetCode 热题 100_从前序与中序遍历序列构造二叉树(47_105_中等_C++)(二叉树;递归)

LeetCode 热题 100_从前序与中序遍历序列构造二叉树&#xff08;47_105&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;递归…

使用WebdriverIO和Appium测试App

1.新建项目 打开Webstorm新建项目 打开终端输入命令 npm init -y npm install wdio/cli allure-commandline --save-dev npx wdio config 然后在终端依次选择如下&#xff1a; 然后在终端输入命令&#xff1a; npm install wdio/local-runnerlatest wdio/mocha-frameworkla…

【Uniapp-Vue3】showLoading加载和showModal模态框示例

一、showLoading加载 uni.showLoading({ title:"标题", // 其他配置 }); uni.hideLoading(); showLoading开启后不会自动关闭&#xff0c;只能手动配置uni.hideLoading() 来关闭加载框。 二、showModel模态框 uni.showModel({ title:"标题", // 其他配置 …

UML系列之Rational Rose笔记八:类图

一、新建类图 首先依旧是新建要绘制的类图&#xff1b;选择class diagram&#xff1b; 修改命名&#xff1b; 二、工作台介绍 正常主要就是使用到class还有直接关联箭头就行&#xff1b; 如果不要求规范&#xff0c;直接新建一些需要的类&#xff0c;然后写好关系即可&#…

HTML应用指南:利用GET请求获取星巴克门店数据

本篇文章&#xff0c;我们将探究GET请求的实际应用&#xff0c;我们使用Python的requests库通过GET请求抓取星巴克门店信息。星巴克作为全球知名的咖啡连锁品牌&#xff0c;其门店分布广泛&#xff0c;获取这些门店的信息对于数据分析、市场研究以及商业决策都具有重要意义。我…

RV1126+FFMPEG推流项目(3)VI模块视频编码流程

视频编码的流程&#xff1a; 本章节讲的是RV1126视频编码的流程&#xff0c;在整个项目之中视频编码功能是核心之一。视频编码流程主要分三步&#xff1a;VI的初始化、VENC的初始化(硬件编码)、绑定VI和VENC节点、开启VENC线程进行视频编码的采集&#xff0c;注意一下这里的…

SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码

导言 如上图所示&#xff0c;进入SimpleFOC官网&#xff0c;点击Github下载源代码。 如上图所示&#xff0c;找到仓库。 comom代码的移植后&#xff0c;simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分&#xff0c;其中communication是跟simpleFOC上位机通讯&a…

【2025最新】机器学习类计算机毕设选题80套,适合大数据,人工智能

【2025最新】机器学习类型计算机毕设选题 1-10套 基于Spring Boot的物流管理系统的设计与实现 基于机器学习的虚假招聘信息的分析与预测 基于机器学习的影响数据科学家职业变动因素的分析与预测 基于Spring Boot的历史文物交流平台的设计与实现 基于机器学习的肥胖影响因素的分…