浅浅的介绍一下STL

1.什么是STL

STL 全称 (Standard Template Library),就是标准模板库,说人话就是C++标准里帮我们写好了一些经常用到的东西,其中包括容器(就是存东西的)、算法(例如之前学过的sort )、迭代器(可以看成功能更强大的指针)。
灵活的运用STL,可以方便我们写代码,减少许多不必要的思维量(毕竟一大票东西别人都写好了,写的还比你自己写的好用)。比如 : sdnu1060 sdnu1090。
但是滥用 STL 也有风险:
1. STL里有很多竞赛不需要的附加功能,运行速度肯定会比手写慢,在竞赛中可能会因此得到 TLE
2. 容易出现一些奇奇怪怪的隐性BUG,并且还很难找到(所以这些东西手写也得会,语法糖吃多了不好)。
3. 考场上容易忘使用方法,或者混淆使用方法并且自以为正确并且样例看起来也确实正确。

2.容器(Containers)

2.1 vector
vector :不定长数组 ( 动态数组 ) 。 我们知道在C语言中,数组大小一旦确定就不能更改,但是有时候我们确实需要动态改变数组的大小,于是 C++ 中就提供了一个不定长数组。
头文件:#include<vector>
指定长度或初始值的初始化

int mian(){vector<int> num1;//定义了一个名为num1,大小为 0,存放int类型数据的数组vector<double> num2;//定义了一个名为num2,大小为0,存放double类型数据的数组vector<Node> num3;//还可以存放自己定义的结构体类型return 0;
}

int mian(){vector<int> a(n);//定义了长度为n的动态数组a,下标和一般数组一样,从0开始vector<int> b(n,0);//定义了长度为n的动态数组b,并且初值全为0vector<int> c(n.100);//定义了长度为n的动态数组c,并且初值全为100return 0;
}

int mian(){vector<int> a={1,4,2,7,5,8};//数组大小为6,元素顺序为1,4,2,7,5,8vector<int> b=a;//与一般数组不同,动态数组可以直接拷贝,而普通的数组不行哦return 0;
}                           //元素的初始化

定义二维数组


int mian(){vector<int> a[5];// 本质等于定义了5个 vector, 分别是a[0], a[1] ... a[4] // 显然这种方式是混合C的数组的,所以显然这个5就 不能改变了,但是a[0] ~ a[4]            的大小是可以改变的 // 这种写法只有列可以改变大小,行不能改变大小return 0;
}   

这里对于二维数组有个形象生动的比喻,以上面的动态二维数组为例,我们将用vector<int> 定义的5个vector.a[0]--a[4]看成一根葡萄藤上的5个节点,将每个vector.a里的元素个数看成每个节点下结的若干个葡萄,这样是不是就好理解多了,节点是不能改变的,而节点下结的葡萄个数却是可以动态增多的。

所以我们有下面的定义方式


int mian(){vector<vector<int>> a(5); // 这样就有一个 行列都可变长的二维数组了 vector<vector<int>> a(5,vector<int> (10, 0)); // 初始化列就等于又初始化一个 vector//定义了一个二维数组,其中初始化有5个葡萄节点,节点数量可以改变,每 个节点下初始化有10个葡萄,葡萄数量可以改变,每个葡萄重量初始化为0。return 0;
}  

这时候大家就会发现,如果要定义多维的数组就要嵌套多个vector,非常麻烦,因此C++ 17之后支持的初始化方式

vector a(5, vector<int>(10));

访问元素:基本和C数组一样,通过下标访问、遍历

vector<int> a(n);//定义一个长度为n的数组
for(int i=0;i<n;i++){cin>>a[i];    //这里循环输入和普通数组一样
}
int res=a[0];     //访问首个元素

C++还提供了智能指针,能自动按顺序访问所有元素(特别注意,sdnuoj系统非常古老,所以提交智能指针会pe)

vector<int> a(n);//定义一个长度为n的数组
for(int i:a){cout<<i<<'\n';
}    //如果你甚至懒得想这个数组是什么类型的,还可以 用auto
for(auto i:a){cout<<i<<'\n';
}

另外STL里的容器也可以使用迭代器访问元素,所谓迭代器可以理解为一种更为强大的指针就行了。(为什么要用迭代器呢?因为STL里面的容器需要实现功能很多,传统指针不够用)

vector<int> a(n);
vector<int> :: iterator i = a.begin();//定义了一个vector<int>类型的迭代器,并且指向了a数组的开头
cout<< *i <<'\n';//输出i所指向的内容;for(i=a.begin();i!=a.end();i++){cout<<*i<<'\n';
}// 同样如果懒得写上面这一坨类名并且还有一堆不明含义 的冒号,也可以使用auto 
auto i = a.begin(); // 遍历同理也可以用这种 
for(auto i : a){cout << i << '\n'; 
}

此外关于vector的函数就太多了,这里浅浅的列举出一些常用的,建议用一个带有代码补全的编辑器,学会看 函数原型以及用户文档来了解。

附上C++的用户手册:https://cplusplus.com/reference/

 例题: P1066P1614

2.2 set( 集合 )
set中的元素不会重复,如果插入了重复的元素,会自动忽略该次插入操作,并且 set 里面的元素自动从小到大排序。
头文件以及定义
#include <set> 
set<int> st; // 定义一个名为set,存放int类型数据的集合 
set<int> st2 = st; //也可以使用类似vector一样的拷贝赋值
一些基本操作
set<int> st;
st.insert(5);
st.insert(0);st.insert(3);
st.insert(1);
ST.insert(3);
st.insert(5);//由于原先已经存入5了,所以这次存入会被忽略cout << st.size() << '\n';   // 输出st的大 小,很明显是4 
cout << st.count(5) << '\n'; // count(x)查询x出现的次数,但是set里元素只能出 现一次, // 所以可以 用来判断x是否在x里出现

注意:set与vector不同,不能通过下标来访问,因此就必须使用迭代器或者智能指针

set<int> :: iterator i = st.begin();
cout<< *i << endl;//输出第一个元素
i = next(i);      //迭代器后移,访问下一个元素
cout<< *i <<endl; //输出下一个元素//当然可以通过迭代器遍历输出
for(i=st.begin(); i!=st.end() ; i++){cout<< *i <<endl;
}//或者智能指针
for(auto i : st){cout<< *i <<endl;
}

再来介绍一些关于set的函数

 set衍生来的一些容器:

unordered_set<int> a; // 无序集合,元素无序,但是只能出现一次 
multiset<int> b; //多重集合,可以存在多个元素
unordered_multiset<int> c //无序多重集合

例题:sdnu1209、sdnu1058

2.3 pair (二元组)

pair里面含有两个元素,可以看作是只有两个元素的结构体。pair只是一个简单二元组,所以没有特别的操作,不过重载了’<‘   运算符使得首先比较 first元素,嗦人话就是优先按照first 元素来比较大小, first 元素相同时在按 second元素来比较大小
头文件以及初始化
#include<utility> 
pair<int, int> p; // 定义了一个first元素为 int, second元素为int的二元组 
p = {5, 3}; // 讲first元素赋值为5, second 元素赋值为3(在一些老版本的编译器上可能用不了) //如果需要将一个5和3结合成二元组,可以使用函数 make_pair(); 
p = make_pair(5, 3);

访问元素

pair<int, int> p = {5, 3};// 要访问第一个元素就使用p.first, 要访问第二个 元素就使用p.second; int a = p.first, b = p.second; // pair<int, int> 其实等价于下面的结构体 struct pair{ int first, second;};

2.4 map(映射)

map 就类似数学上的函数。长这个样子-> map<int, int>mp 。可以看到 map 也有 first second 两个元素,我们把first叫做键值 (key) ,把 second 叫做值 (value) 。在 map里面,一个 key 对应一个 value ,类似函数里一个 x 对应一个 y。并且在map 里, x不能重复,自动按从小到大排序。
可以把 map 看成由一堆 pair 组成的 set
头文件以及初始化
#include<map>map<int,int> mp;      //定义了一个int映射int的map;
map<int,string> mp;   //定义了一个string映射int的map;
map<char,int> mp;     //定义了一个char映射int的map;
map<int, node> mp     // 定义了一个int映射node的map(node是结构体)

基本操作

map<int,int> mp;
mp.insert(make_pair(1,2));        // 插入key为 1,value为2的映射
mp.insert({1,2});                 // 在C++11版本之后,可 以用花括号来生成结构体了cout<< mp[1] <<endl;              //输出1的映射,显然是2mp[1]=3;                          //把原先的1映射2,改成1映射3
cout<< mp[1] <<endl;              //显然这时候会输出3cout<< mp[2]<<endl;               //如果原先没有定义2的映射,那么自动生成2映射0;
遍历map 以及两种智能指针
//遍历map
map<int, int> :: iterator i;
for(i = mp.begin() ; i!= mp.end(); i++){cout<< *i.first <<' ' << *i.second;
}//智能指针
for( auto i: mp){cout<< i.first <<' ' << i.second;
}//另一种智能指针
for(auto[x ,y] : mp){cout<< x << ' ' << y <<'\n' ;
}

这里再介绍一些其他关于map的操作

map 衍生来的一些容器
unorder_map<int, int> mp; // 无序
到这里常用的容器就基本结束了,还有一些可能会用到的容
器,感兴趣可以自行了解: bitset array tuple
例题:sdnu1058、sdnu1703

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

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

相关文章

浅浅的计算机网络知识

目录 计算机网络&#xff08;连接分散计算机设备以实现信息传递的系统&#xff09;_百度百科 传输协议 传输层次 通信 计算机网络协议分层结构 开放系统互连参考模型的特点 IPv4协议 IPv6协议 FTP HTTP 网络传输协议 较为系统框架 先面向百度搭建理解框架 计算机网…

浅浅理解一下堆

目录 一、堆的定义及本质 二、堆的核心操作 1、向下调整 2、堆的创建 3、向上调整 三、堆的比较器传入及堆中简单函数的实现 四、堆的应用 1、用于OS调度进程 2、topk问题 3、堆排序 一、堆的定义及本质 堆在Java中是以优先级队列来表现的&#xff08;PrityQueue&#…

浅浅的复习一下sql

DISTINCT 语法&#xff1a; SELECT DISTINCT 列名称 FROM 表名称1、现在有一个表如下&#xff1a; 2、执行sql语句-1 SELECT DISTINCT ename,email FROM emp 结果&#xff1a; 说明&#xff1a;由于小刘的ename和email重复了&#xff0c;所以结果只显示一次&#xff01; 3…

浅浅仿制一个APP首页

一、实验目标 做一个APP首页&#xff0c;包括顶部图片、顶部菜单栏、中部消息模块、底部Tab按钮。学习 ScrollView, RelativeLayout&#xff0c;以及插件之间的穿插使用。 二、实验步骤 列出实验的关键步骤、代码解析、截图。 1.逻辑梳理 做一个app首页&#xff0c;包括顶部…

花嫁之容氏浅浅最后怎么样了_花嫁之容氏浅浅章节目录阅读

花嫁之容氏浅浅小说完整版无弹窗在线阅读。花嫁之容氏浅浅小说是作者&#xff1a;许暖暖创作完成的一本热门玄幻灵异小说&#xff0c;主要讲述女主舒浅和鬼王容祁两人的精彩故事。梦里&#xff0c;舒浅感受到一双冰冷的手在自己身上游走&#xff0c;可是即使这样&#xff0c;舒…

干货文章 | 低代码真的有价值吗?

作者&#xff1a;瀚码技术钟惟渊&#xff08;第⼀作者&#xff09;、独⽴顾问王甲佳&#xff08;第⼆作者&#xff09;、瀚码⼀⼑云叨叨AI助⼿&#xff08;第三作者&#xff09; 全文共4912字&#xff0c;阅读约需要15min 本系列文章由瀚码技术钟惟渊构思、制定大纲、组织了关…

零信任落地实践【新世界】

&#x1f315;写在前面 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ✉️今日分享&#xff1a; 莫道前路多险阻&#xff0c;再闯关山千万重 &#x1f340; 前言 轻舟已过万重山&#xff0c;始终不忘初心。在网络安全领域&#xff0c;我们…

神龙显灵-走进中国传统节日二月二龙抬头

二月二龙抬头&#xff0c;是中国传统的节日之一&#xff0c;也是春节的收官之战。这个节日被视为一个转折点&#xff0c;标志着春天的到来&#xff0c;也为农民们带来了新的希望和期待。 二月二这个日子有很多习俗和传说&#xff0c;其中最著名的就是“龙抬头”。据传说&#…

盘古大模型,让人人实现数字人自由

编辑&#xff1a;阿冒 设计&#xff1a;沐由 就在华为开发者大会2023 < HDC.Cloud 2023 > 正式开启的前夜&#xff0c;一则重磅消息从海外传来&#xff1a; 国际顶级学术期刊《自然》&#xff08;Nature&#xff09;杂志正刊发表了华为云盘古大模型研发团队研究成果——《…

奥运礼服设计师:AIGC 让童装设计从绿皮车进入高铁时代

近日&#xff0c;由温州 AIGC 产业联盟、温州市服装商会共同发起的“首届温州鞋服产业 AIGC 设计大赛”活动正如火如荼进行。大赛聚焦 13 岁青少年服饰设计这一行业存在已久的难题&#xff0c;探讨如何利用 AIGC 热门工具解决青少年服装设计痛点。据巴比特了解&#xff0c;该活…

每日互动(个推)CTO叶新江:AIGC时代,大模型推动数据要素商业化

ChatGPT在一夜之间火爆互联网&#xff0c;让AIGC受到世界范围内的高度关注。时至今日&#xff0c;AIGC热度持续高涨&#xff0c;各大互联网公司争相布局这一领域。日渐成熟的技术、显著的降本增效优势以及日益增长的市场需求等因素&#xff0c;已经推动AIGC成为互联网公司新一轮…

YEF 2023 18日开幕,逾千青年精英齐聚话“突围”

YEF2023 18日在温州开幕&#xff0c;在CCF YOCSEF创建25周年之际&#xff0c;逾千名计算机相关的学术、技术、产业、媒体、社会组织中的青年人才&#xff0c;汇聚温州鹿城区&#xff0c;一起回望、一起思辨、一起突围。 5月18日上午&#xff0c;由CCF主办&#xff0c;温州市人民…

AI大模型迈入应用时代,每日互动推动“可控大模型”落地

垂直行业更需要可控大模型 当下&#xff0c;大模型正在不断精进&#xff0c;以GPT-4、文心一言为代表的大模型&#xff08;LLM&#xff09;表现出了强大的逻辑推理能力&#xff0c;并能够很好地处理复杂任务&#xff0c;使得社会生产力得到了飞跃式提升。 面对大模型热度的持…

喜报 | 客户赞誉!获温州银行授予优秀供应商证书

近日&#xff0c;温州银行金融科技部在杭州、温州两地同时展开2022年度供应商表彰活动&#xff0c;意在鼓励先进、鼓舞干劲。擎创科技作为温州银行长期合作的供应商之一&#xff0c;凭借在智能运维领域精研的技术优势及“以客户成功为本”的服务价值观&#xff0c;深得客户青睐…

数画自研chatgpt,imagegpt人工智能语言技术,颠覆对AI绘画的认知

2023年1月1日&#xff0c;数画AI绘画又爆火了&#xff0c;这一次是数画团队自研了chatGPTimageGPT人工智能技术&#xff0c;值得人们注意的是&#xff0c;并非引用海外的openAI人工智能语言模型&#xff0c;而是完全自研首发的国产人工智能技术&#xff0c;数画团队来自于温州专…

使用SVG.Net生成svg格式文字图片

由于项目需要&#xff0c;需生成svg格式文字图片&#xff0c;网上的文档较少&#xff0c;在一番查阅之后成功实现。现记录下来&#xff0c;方便以后自己查阅&#xff0c;以及需要的人也可当做参考&#xff0c;水平不高&#xff0c;少喷。 主要运用到GitHub开源项目: svg.net 不…

利用ps导出svg(主要用于上传自定义图标到iconfont)

ps版本&#xff1a;2020 借鉴文章&#xff1a;https://blog.csdn.net/k912120/article/details/118787809 事情起因是我不想多此一举下个AI,本来想ps直接导出svg格式,但是导出来上传到iconfont后却是一片空白&#xff0c;相信很多人第一次都遇到过这种情况。 我一愣&#xff…

将图片转化成SVG格式(亲测可行)

1.准备好要转化的图片 可以看到左侧图片是一个jpg格式的&#xff0c;接下来我们就把它转化成svg格式; 2.打开SVG在线编辑器&#xff0c;把图片导入 我们可以打开SVG在线编辑器&#xff0c;在SVG编辑器中导入图片并根据我们需要的大小进行设置&#xff0c;如下图&#xff1a; …

微信图文消息中如何使用svg图片

微信图文消息无法上传svg格式图片,但是可以通过浏览器开发者工具进行hack 将svg图片使用文本编辑器打开,复制内容登录微信公众平台,新建图文消息输入正文的输入框中输入随意文字打开浏览器控制台(右键检查或按F12),找到步骤2输入文字对应的html标签在html标签右键,选择’Edit …

原腾讯QQ技术总监、T13专家,黄希彤被裁,原因竟是不愿意被 PUA ?

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 曾经风光无限的互联网“淘金地”&#xff0c;为无数技术人提供了造梦机会&#xff0c;也带领着一批程序员走向致富之路。然而&#xff0c;如今国内各大厂也在经历着“瘦身”运动。 据 T…