2025年STL (C++) 应用

STL (C++) 应用定义 STL 是 Standard Template Library 的简称 从根本上说 STL 是一些 容器 的集合 这些 容器 有 list vector set map 等 STL 也是算法和其他一些组件的集合 STL 可分为容器 containers 迭代器 iterators

大家好,我是讯享网,很高兴认识大家。

定义:

         STL是Standard Template Library的简称。从根本上说,STL是一些"容器"的集合,这些"容器"有list,vector,set,map等,STL也是算法和其他一些组件的集合。

         STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。

       STL结构图:

在这里插入图片描述
讯享网

 STL 应用

      one.头文件:   

                include作用:在include的地方,把头文件里的内容原封不动的复制到引用该头文件的地方。

                   头文件引用:头文件引用有两种形式:#include < stdio.h> 和 include "main.h"。
用< >引用的一般是编译器提供的头文件,编译时会在指定的目录中去查找头文件。用" "引用的一般是自己写的头文件,编译时,编译器会在项目所在的文件夹中进行查找。
               总结:系统提供的头文件用< >引用, 自己写的用” "引用。

                格式:

#define XXX #ifndef XXX #endif

讯享网

             常用头文件:

讯享网#include <bits/stdc++.h> //万能头 #include <iostream> #include <cstdio> #include <string> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <queue> #include <vector> #include <ctime>

       详细应有可看:C语言头文件_init33的博客-CSDN博客_c语言头文件

      two.排序:

                  快排(sort):   sort是STL中自带的排序函数      复杂度  O(n log n)

                                     格式:sort(要排序元素的起始地址,要排序元素的结束地址,比较函数);

                                 代码:(从小到大)

#include<bits/stdc++.h> using namespace std; int n,a[]; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); for(int i=1;i<=n;i++) cout<<a[i]; return 0; }

                             从大到小:加一个判断函数即可

讯享网#include <bits/stdc++.h> using namespace std; int f[],n; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[]; sort(f+1,f+n+1,greater<int>()); for(int i = 1;i <=n;i++) cout<<f[i]<<" "; return 0; } 

                  或:

#include <bits/stdc++.h> int n,f[]; bool cmp(int a,int b){ return a<b;} int main() { cin>>n; for(int i=1;i<=n;i++) cin>>f[i]; sort(f+1,f+n+1,cmp); for(int i=1;i<=n;i++) cout<<f[i]<<" "; return 0; } 

       结构体排序:

讯享网#include <bits/stdc++.h> struct node{int x,y,t;}p[]; bool cmp(node a,node b){return a.t<b.t;} int n; using namespace std; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y,p[i].t=p[i].y-p[i].x; sort(p+1,p+n+1,cmp); for(int i=1;i<=n;i++) cout<<p[i].x<<" "; return 0; } 

        three.容器

                        ① map    写法:map<基本数据类型,基本数据类型>(不需要一样)X

                                            map常用于打标记     map可以看作是一个无限长度的数组

                                               基本构造函数:

map < string , int > mapstring; map < int , string > mapint; map < sring , char > mapstring; map < char , string > mapchar; map < char , int > mapchar; map < int , char > mapint; 

                             举个例子:

讯享网map<string,int> p; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>s>>x,p[s]=x; cin>>y>>l; if(p[y]==l) cout<<"Yes"; else cout<<"No"; }

                     ② vector    初始化 :vector<基本数据类型> k;

                                         使用操作:

                                                     1.   属性操作

v1.size()      //v1内已经存放的元素的数目 v1.capacity()    // v1现有的在存储容量(不再一次进行扩张内存空间的前提下) v1.empty()     // 判断v1是否为空 v1.max_size()    // 返回vector可以存放的最大元素个数,一般这个数很大,因为vector可以不断调整容量大小。 v1.shrink_to_fit()  // 该函数会把v1的capacity()的大小压缩到size()大小,即释放多余的内存空间。 

                                                  2.访问操作

讯享网 v1[n]        // 通过下标进行访问vector中的元素的引用 (下标一定要存在 ,否则未定义,软件直接崩了) v1.at(n)       // 与上面类似,返回下标为n的元素的引用,不同的是,如果下标不存在,它会抛出out_of_range的异常。它是安全的,建议使用它。 v1.front()      // 返回vector中头部的元素的引用(使用时,一定要进行非空判断) v1.back()      // 返回vector中尾部的元素 引用(使用时,一定要进行非空判断) 

                                                3.添加操作

v1.push_back(a)        //在迭代器的尾部添加一个元素 v1.push_front(a)        // vector不支持这个操作 v1.insert(iter, a)        // 将元素a 插入到迭代器指定的位置的前面,返回新插入元素的迭代器(在c++11标准之前的版本,返回void) v1.insert(iter, iter1, iter2)    //把迭代器[iterator1, iterator2]对应的元素插入到迭代器iterator之前的位置,返回新插入的第一个元素的迭代器(在c++11标准之前的版本, 返回空)。 

                                               4.删除操作

讯享网v1.erase(iterator)     // 删除人人迭代器指定的元素,返回被删除元素之后的元素的迭代器。(效率很低,最好别用) v1.pop_front()       //vector不支持这个操作 v1.pop_back()      //删除vector尾部的元素 , 返回void类型 (使用前,一定要记得非空判断) v1.clear()         //清空所有元素 

                                                  5.代替操作

v1.assign({初始化列表})    // 它相当于赋值操作, v1.assign(n, T)        // 此操作与初始化时的操作类似,用个n T类型的元素对v1进行赋值 v1.assign(iter1, iter2)     // 使用迭代器[iter1, iter2]区间内的元素进行赋值(该迭代器别指向自身就可以),另外,只要迭代器指的元素类型相同即可(存放元素的容器不同,例如:可以用list容器内的值对vector容器进行assign操作,而用 "=" 绝对做不到的。 v1.swap(v2)      // 交换v1与v2中的元素。 swap操作速度很快, 

                               ③ 队列(queue)  先进先出 初始化:queue<基础类型> X

                                          基本操作:

讯享网 q.push(x); //入队,将元素 x 从队尾插入(尾插法) q.pop(); //出队,删除对首元素,并返回其值 q.size(); //返回队中元素个数 q.front(); //返回对首元素 q.back(); //返回队尾元素 q.empty(); //判断是否为空(空返回 1,非空返回 0)

                                              优先队列(priority_queue)是一种会按照默认或自定义的优先级进行自动排序的队列,其特点是优先级高的元素排在队首,低的排在队尾。

                                  ④ 栈(stack) 

                                          栈就像一个盒子,可以放入或去除元素,但是要把盒子底下的东西取出来,就必须先取出上面的东西。

                                       生动动画:请添加图片描述

 图片来源:知乎:不淡定的小淡定 

                                栈

                   栈的定义:

stack<类型(可以不写)> st; 或者stack st;

               函数:

讯享网代码 含义 push() 压栈,增加元素 O(1) pop() 移除栈顶元素 O(1) top() 取得栈顶元素(但不删除)O(1) empty 检测栈内是否为空,空为真 O(1) size() 返回stack内元素的个数 O(1)

                       ⑤二分查找

                                 A .lower_bound函数

                                   查找的数组下标 = lower_bound(数组要查找的开始位置,数组要查找的结束位置后面,要找的数) – 数组开始位置(一般写数组名);

                                 B.upper_bound函数        快速二分查找出第一个大于指定数的位置(下标)

                                C.binary_search:查找数组内某个元素是否出现。

                                                             void binary_search(数组首地址,结束地址,要查找的数)

                                                             返回值为bool类型,找到了返回true。

                       ⑥pair   只含有两个元素,可以看作是只有两个元素的结构体。

pair<int,int> p[20] cout<<p[x].first<<p[x].second; 

                    ⑥unique()去重

                          函数原型:unique(起始地址, 末尾地址, fun);其中fun为自定义的函数名。

                        注意:unique函数去重并不是真正的去重,它是不断的将后面不重复的元素覆盖前面重复的元素,最后返回最后一个不重复的元素的地址。

                      如果要真的去重,需要erase();

                    代码:

讯享网#include<bits/stdc++.h> using namespace std; int main(){ vector<int> vec={1,1,2,3,3,4,4,5}; auto pos=unique(vec.begin(), vec.end()); vec.erase(pos, vec.end()); for(int v:vec) cout<<v<<' '; cout<<endl; return 0; } 

总结:STL真的''千奇百怪'',相信大家看完之后对STL会有更深的理解,如果有什么不足之处,欢迎大家指出。

参考资料:

  STL(模板库)_360百科

【C++】STL应用(详解)_打代码能当饭吃?的博客-CSDN博客_c++stl基础及应用

C语言头文件详解_正在起飞的蜗牛的博客-CSDN博客_c语言头文件

c++STL库最详细介绍(保姆级教学)_我要取个特别特别特别特别特别特别长的名字的博客-CSDN博客_c++ stl库

c++常见的几种排序_假如我年少有为的博客-CSDN博客_c++排序

C++ map函数_Water_Coder的博客-CSDN博客_c++ map函数

C++中常用的std标准容器(全部容器功能介绍)_流楚丶格念的博客-CSDN博客_std 容器

STL函数大全_FoLiaGe丶的博客-CSDN博客_stl函数

【数据结构】栈(stack)-顺序栈(动态图解、c++、java)_URLeisure的博客-CSDN博客_进栈出栈顺序图解

c++stl库函数_列出C ++ STL(标准模板库)中的函数_cumtv80668的博客-CSDN博客

小讯
上一篇 2025-02-13 12:34
下一篇 2025-02-08 12:00

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/47145.html