STL (C++) 应用

发布于:2022-08-08 ⋅ 阅读:(372) ⋅ 点赞:(0)

定义:

         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[100010];
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[100010],n;
int main() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>f[100010];
    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[100010];
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[100010];
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博客


网站公告

今日签到

点亮在社区的每一天
去签到