STL入门

STL入门

作者:blue

时间:2024.3

文章目录

  • STL入门
    • 0.概述
    • 1.pair
    • 2.set(集合)
    • 3.vector
    • 4.string字符串类型
    • 5.queue,deque,priority_queue
    • 6.list的用法

0.概述

本文讨论部分常用的STL的运用

1.pair

pair是将2个数据组合成一组数据,

pair的实现是一个结构体,主要的两个成员变量是first second

pair<int ,double> p1;//注意中间要有逗号p1.first = 1;p1.second = 2.5;cout<<p1.first<<' '<<p1.second<<endl;//输出结果:1 2.5

还可以利用make_pair创建新的pair对象:

pair<int, double> p1;
p1 = make_pair(1, 1.2);        //make_pair
cout << p1.first << p1.second << endl;//output: 1 1.2int a = 8;string m = "James";pair<int, string> newone;newone = make_pair(a, m);
cout << newone.first << newone.second << endl;//output: 8 James

通过tie获取pair元素值

std::pair<std::string, int> getPreson() {return std::make_pair("Sven", 25);
}int main(int argc, char **argv) {std::string name;int ages;std::tie(name, ages) = getPreson();std::cout << "name: " << name << ", ages: " << ages << std::endl;return 0;
}

2.set(集合)

集合是存储排序键的关联容器,其中每个键都是唯一的,可以插入或删除但不能更改。

begin()返回一个指向集合中第一个元素的迭代器
end()返回指向末尾的迭代器
empty()如果set为空,则返回true
insert()在集合中插入元素。
clear()删除set容器中的所有的元素

初始化

template< class T,            class Compare = less<T>,    class Alloc = allocator<T>   > class set;

基本上就是三个参数,第一个是值,第二个比较器,用于比较内容,默认为less即降序,第三个是内存配置器,负责内存的分配和销毁。

在实际使用中,我们仅仅为其分配值就足以满足大部分需求。

set<int> s;    //直接指定值的类型创建,其他为默认方法
#include <iostream>
#include <set>
using namespace std;
int main()
{                   /*两个‘>’之间最好有空格*/set<pair<double, double> > s;     //建立一个其中类型为pair<double,double>的集合,名为sint x1, y1, x2, y2;for (x1 = 0; x1 < 20; x1++){for (y1 = 0; y1 < 21; y1++){for (x2 = x1 + 1; x2 < 20; x2++){for (y2 = 0; y2 < 21; y2++){double k = double(x1 - x2) / (y1 - y2);double b = double(x2 * y1 - x1 * y2) / (x2 - x1);s.insert({ k,b });     //将元素值插入到集合s当中,集合会自动去重。}}}}printf("%lld", s.size() + 20);return 0;
}

set中元素的遍历

关键是要声明迭代器变量,遍历方法与数组类似,可以用while循环也可以用for循环,但用for循环时条件运算符不能用 <,而用 != 进行判断,还特别需要注意指针运算符

#include<iostream>
#include<set>
using namespace std;set<int>all;
int main()
{//生成待处理的数据for(int i=0;i<100;i++)all.insert(i);//遍历set,用迭代器类型⬇️⬇️⬇️ 注意这种for(set<int>::iterator i=all.begin();i!=all.end();i++)cout<<*i<<endl; //注意指针运算符return 0;
}

3.vector

vector是一个十分有用的容器

简单地说,vector是一个能够*存放任意类型的动态数组*,能够增加和压缩数据。

实例:
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
signed main()
{int i;vector<int> a;           //定义for(i=0;i<=100;i++){a.push_back(i);      //尾部压入}for(i=0;i<a.size();i++)   //把其当数组来遍历 {printf("%lld ",a[i]);}reverse(a.begin(),a.end());   //逆转容器中的值 printf("\n");                        //⬇️,注意这里要用"!="for(vector<int>::iterator j=a.begin();j!=a.end();j++)  //把他用迭代器指针来遍历 {//⬇️注意迭代器调用,用指针printf("%lld ",*j);}return 0; 
}

运行结果

在这里插入图片描述

排序

sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).bool cmp(int a,int b)
{return a>b;
}
调用时:sort(vec.begin(),vec.end(),Cmp),这样就降序排序。

4.string字符串类型

C++ string中的find()函数 - 王陸 - 博客园 (cnblogs.com)

为什么 string.find()返回值是-1_string中find函数-1为什么是18446744073709551615-CSDN博客

两篇文章结合着看

0顺子日期 - 蓝桥云课 (lanqiao.cn)

本题考查了对字符串类型的应用

#include <iostream>
#include <string>
using namespace std;
int main()
{int ans=0;string t1="012",t2="123";for(int i=1;i<=12;i++){for(int j=1;j<=31;j++){string str="2022";if(i>=10) str+=to_string(i);else{str+='0';str+=to_string(i);}if(j>=10) str+=to_string(j);else{str+='0';str+=to_string(j);}if(str.find(t1)!=-1||str.find(t2)!=-1) ans++;}}printf("%d",ans);return 0;
}

C++:cin、cin.getline()、getline()的用法_getline(cin,s)函数用法-CSDN博客

关于string,输入带空格或tab的字符串的有趣的用法。

C++中substr()函数用法详解_c++ substr-CSDN博客

string的用法总让人大吃一惊,还能这样用?

 s.substr(pos, len)//string a=s.substr(0,3);s中从pos开始的len个字符的拷贝

5.queue,deque,priority_queue

队列

queue<type> q
q.push(x) //将x放入队列
q.front() //返回队首元素但不删除
q.pop()   //删除队首元素
q.back()  //返回队尾元素
q.size()  //返回元素个数
q.empty() //检查队列是否为空,空则返回true

双端队列

由于双端队列,队首队尾都可以入队与出队的特点,他的入队出队操作与普通的queue不同,要格外注意

deque<type> dq
dp[i] //返回队列中下标为i的元素
dq.front() //返回队头
dq.back()  //返回队尾
dq.pop_back()//删除队尾,不返回值
dq.pop_front()//删除队头,不返回值
dq.push_back(x)//在队尾添加一个元素x
dq.push_front(x)//在队头添加一个元素x

双端队列的一个重要应用——单调队列

①单调队列与滑动窗口

#include <iostream>
#include <queue>
using namespace std;
int main()
{           //数组从下标1开始存储,这个0是占位 int a[]={0,2,6,5,7,8,6};int m=3;//窗口的大小 deque<int> Q;//存放元素的下标 //滑动窗口的边界为  [i-m+1,i] for(int i=1;i<=6;i++)  //维护窗口的最小值,保持队首元素永远是窗口内最小的 {while(!Q.empty()&&a[Q.back()]>a[i]) Q.pop_back();  //新进元素更优,队尾出队 Q.push_back(i);//存储的是下标 if(Q.front()<i-m+1) Q.pop_front(); //队首已在窗口之外,队首出队 if(i>=m) printf("%d ",a[Q.front()]);//窗口充满,可以输出 }printf("\n");for(int i=1;i<=6;i++) //维护窗口的最大值 {while(!Q.empty()&&a[Q.back()]<a[i]) Q.pop_back();Q.push_back(i);if(Q.front()<i-m+1) Q.pop_front();if(i>=m) printf("%d ",a[Q.front()]);} return 0;
}

优先队列(priority_queue)

默认大顶堆

priority_queue <Type, Container, Functional> 队列名 //类型,容器类型,比较方式priority_queue <int,vector<int>,greater<int> > q;//升序队列(最小值优先)priority_queue <int,vector<int>,less<int> >q;    //降序队列,最大值优先(默认的)

由于优先队列是以堆的形式存储数据的,所以队首的元素应该是堆顶(top),这一点要和其他队列区分开来

q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素

自定义优先级(要注意和自定义排序区分开,不要搞混了)

在这里插入图片描述

结构体自定义优先级

在这里插入图片描述

6.list的用法

详解C++STL容器系列(二)—— list的详细用法和与vector的对比_vector assign swap 区别-CSDN博客

掌握stl中list的用法

P1996 约瑟夫问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <list>
using namespace std;
int main()
{int n,m;cin>>n>>m;list<int> a;for(int i=1;i<=n;i++) a.push_back(i);list<int>::iterator it=a.begin();while(a.size()>1){for(int i=1;i<m;i++){it++;if(it==a.end()) it=a.begin();}cout<<*it<<" ";list<int>::iterator next=++it;if(next==a.end()) next=a.begin();//end()成员函数返回指向末尾位置的迭代器。这个“末尾位置”            指的是最后一个元素再往后一位,也就是说end()所指的位置不包含有效元素,它相当于一个虚设的节点。a.erase(--it);it=next;}cout<<*it;return 0;
}

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

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

相关文章

洛谷 P10463 Interval GCD Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k)&#xff1a;对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …

从声源定位(DOA)算法仿真到工程源码实现-第八节

一、概述 本节我们记录在respeaker core v2 开发板上部署一个完整的声源定位(DOA)系统&#xff0c;演示可以看第一节中的视频。整个模块可以分为三部分&#xff0c;第一部分为控制开发板上的LED灯显示&#xff0c;这样可以实时的测试算法的效果&#xff1b;第二部分为从ALSA上取…

在linux部署网站

在Linux部署网站&#xff0c;需要准备一个纯净的系统 一、系统环境准备 1.设置静态IP地址 ‌ 2.关闭默认防火墙 systemctl disable firewalld --now ‌ 3.配置SSH密钥登录 4.yum update -y && reboot # 更新系统内核 5.yum install -y wget curl unzip # 安装…

Java后端API限流秘籍:高并发的防护伞与实战指南

目录导航 📜 🛡️ 为什么需要API限流?🧠 主流限流算法大解析👩‍💻 阿里巴巴的限流实践📏 四大黄金定律🤼 限流策略组合拳🏆 限流场景实战💻 技术实现方案🌟 最佳实践分享📈 结语与展望📚 推荐阅读 1. 🛡️ 为什么需要API限流? 在高并发环境中,未…

OpenGL ES 2.0与OpenGL ES 3.1的区别

如果硬件支持且需要更高质量的图形效果&#xff0c;推荐3.1&#xff1b;如果兼容性和开发简便更重要&#xff0c;且效果需求不高&#xff0c;2.0更合适。不过现代车载系统可能越来越多支持3.x版本&#xff0c;所以可能倾向于使用3.1&#xff0c;但具体情况还需调查目标平台的硬…

k8s存储介绍(五)PV与PVC

在 Kubernetes&#xff08;k8s&#xff09;中&#xff0c;持久化存储&#xff08;Persistent Storage&#xff09;是一个非常重要的概念&#xff0c;因为 Pod 本身是无状态的&#xff0c;重启后会丢失数据。为了支持有状态应用&#xff0c;Kubernetes 提供了持久化存储的机制&a…

ORA-00600 [2662]

一、数据库启动报ORA-00600[2662] [oraclenode1 ora11g]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 22 14:37:00 2011Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to an idle instance.SQL> startup ORACLE instanc…

WebSocket接入SSL证书

目录 碎碎念解决方法创建 HTTPS WebSocket 服务器创建系统服务启动服务 碎碎念 在访问网站时&#xff0c;使用 HTTPS 非常重要。HTTPS 协议不仅可以确保数据传输的安全性&#xff0c;还可以防止中间人攻击和数据篡改等安全问题。任何没有 SSL 证书的内容都可能会被拒绝访问。因…

c#在work线程中怎样更新UI控件

最近笔者调试修改项目&#xff0c;碰到了c#在work线程中怎样更新UI控件中的场景&#xff0c;简单总结了下&#xff0c;主要有两个方法&#xff1a; 方法1&#xff1a;通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…

数据结构每日一题day3(顺序表)★★★★★

题目描述&#xff1a;顺序表L的元素递增有序排列&#xff0c;设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想&#xff1a;在递增有序的顺序表中插入元素 x 并保持有序性&#xff0c;步骤如下&#xff1a; 合法…

MyBatis中mapper.xml 的sql映射规则

一、SQL 映射文件核心元素 MyBatis 映射文件的顶级元素&#xff08;按定义顺序&#xff09;&#xff1a; cache&#xff1a;命名空间的缓存配置。cache-ref&#xff1a;引用其他命名空间的缓存。resultMap&#xff1a;自定义结果集映射。sql&#xff1a;可重用的 SQL 片段。i…

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;…

Ubuntu服务器中Swapper如何与虚拟内存配合

在Ubuntu服务器中&#xff0c;Swapper和虚拟内存是操作系统中重要的概念&#xff0c;它们共同协作以提高系统的内存管理效率。当物理内存不足时&#xff0c;Swapper会帮助系统将不活跃的数据从内存转移到磁盘上的交换空间(Swap)&#xff0c;以释放内存给需要更多资源的进程。下…

SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景

以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景&#xff1a; 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数&#xff0c;范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…

vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 &#xff0c; 这次的功能是将公式能插入编辑器以及修改 1、Tinymce 自定义 LateX 按钮&#xff0c;打开公式编辑器窗口 LateX.vue window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton(LateX, {text:…

python数据增强和转换

数据增强和转换 固定转换随机转换概率控制的转换 固定转换 边缘补充像素(Pad)尺寸变换(Resize)中心截取(CenterCrop)顶角及中心截取(FiveCrop)尺灰度变换(GrayScale) 概率控制的转换 随机垂直翻转(RandomVerticalFlip)随机应用(RandomApply) # -*- coding: utf-8 -*- fro…

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知&#xff0c;Ubuntu默认使用Nouveau开源驱动&#xff0c;其性能受限&#xff0c;因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单&#xff0c;只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…

05_循环结构三目运算符

目录 一、双重for循环 练习 二、break关键字 三、continue 关键字 练习 四、三元运算 / 三目运算 一、双重for循环 外层循环 循环一次&#xff0c;&#xff0c;&#xff0c;内层循环 循环一圈&#xff01;&#xff01;&#xff01; 循环里嵌套循环&#xff1a; for(var…

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…

鸿蒙HarmonyOS NEXT之无感监听

鸿蒙中存在一些无感监听&#xff0c;这些监听经过系统API封装使用很简单&#xff0c;但是对实际业务开发中有很重要&#xff0c;例如埋点业务、数据统计、行为上报、切面拦截等。 Navigation的页面切换 在鸿蒙中Navigation被用来作为路由栈进行页面跳转&#xff0c;如果你想知…