首页 > 其他分享 >标准模板库 01 概念

标准模板库 01 概念

时间:2022-10-28 22:13:51浏览次数:50  
标签:01 函数 适配器 概念 vector 分配器 include 模板

STL是可复用的标准模板库,在泛性思维上架设的一个概念结构,使抽象概念为主体,并使其系统化。

容器(containers):用于存放数据,包含各种如vector,list,deque,set,map等数据结构。

分配器(allocators):存在于每个容器中,实现动态的空间配置、空间管理、空间释放。

算法(algorithms):操作数据的方法。

迭代器(iterators):迭代器就是算法和数据之间的桥梁,泛化的指针。

仿函数(functors):自定义类型的计算,算法的某种策略,内部是重载。

适配器(Adapter):用于转换,修饰接口,可以转换容器、仿函数、迭代器。比如stack和queue的底层就是借助deque完成的,属于容器适配器。

 

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
​
using namespace std;
​
int main()
{
    int ia[6]={27,210,12,47,109,83};
    vector<int,alloctor<int>>vi(ia,ia+6);//1
    cout << count_if(vi.begin(),vi.end(),not1(bind2nd(less<int>(),40)));//2
    return 0;
}

解释:

1.定义vector,后面的<>进行传参。第一个参数是数据类型,第二个模板参数的分配器(一般忽略不写,源代码有默认值)分配器本身是一个模板,要传参alloctor<int>,要与前者匹配。

2.count_if()是一个算法,计算出条件之下符合条件的元素有几个。less<int>()是仿函数,判断a是否小于b。

bind2nd和not1是函数适配器,bind2nd可以绑定第二个参数,将a小于b转换为a小于40.not1则是反转结果,变为大于等于40。

 

在STL中,这些“一整组操作”都是通过仿函数的形式实现的。简单来说就是对操作符进行重载。比如左右括号。

template <class T>
   struct plus{//仿函数plus
       T operator()(const T& x,const T& y) const {return x + y}
   };
​
int main()
{
    //产生仿函数对象
    plus<T> plusobj;
    
    //使用仿函数
    cout<<plusobj(2,3);
    
    //产生仿函数临时对象
    cout<<plus<int>(2,3);
}

 

 

标签:01,函数,适配器,概念,vector,分配器,include,模板
From: https://www.cnblogs.com/anzf/p/16837669.html

相关文章

  • 【笔记05】Javascript - 基本概念 - (函数递归)
    先看一个试题: 求n的阶乘通常,我们会写:functionfac(num){varres=1;for(vari=1;i<=num;i++){res*=i;}returnres;}观察阶乘可以发现两个特点:特点一:......
  • 数据库启动时报警 ORA-03113 ORA-16014 ORA-00312
    系统:CentOS7.9数据库:oracle11.2.0.4问题描述:数据库启动时报警ORA-03113,如下所示:SQL>startupORACLEinstancestarted.TotalSystemGlobalArea2455228416bytesFixedS......
  • P2486 [SDOI2011]染色
    #include<iostream>#include<vector>usingnamespacestd;#defineintlonglongconstintN=1e5+1;intn,m;vector<int>to[N];intdep[N],fa......
  • P4213 【模板】杜教筛(Sum)
    题目链接P4213【模板】杜教筛(Sum)题目描述给定一个正整数,求\[ans_1=\sum_{i=1}^n\varphi(i)\]\[ans_2=\sum_{i=1}^n\mu(i)\]输入格式本题单测试点内有多组数据。......
  • 【JLOI2016_SHOI2016】侦察守卫(树形DP)
    考虑树形DP,假设我们已经考虑完当前子树内监听点的放置情况,根为\(u\),考虑我们要记录什么状态:\(u\)子树内的监听点向子树外还能监听多远,\(u\)子树内距离根最远的未被监听......
  • 【HNOI2017】礼物(FFT)
    显然,\(y_i\)加上\(c\)可以看成是\(x_i\)减去\(c\)。所以就变成了\(x_i\)加上一个整数(可正可负)。现将\(x\)环拆成一个长度为\(2n\)的序列\(a\)(复制一遍),把\(......
  • 【HNOI2016】序列(线段树)
    题意扩展版:有两个长度为\(n\)的序列\(a,b\),你需要维护\(m\)次操作:对\(a\)区间赋值。给定\(l,r\),对于所有\(i\in[l,r]\),执行\(b_i\getsb_i+a_i\)。询问区间......
  • 【HNOI2015】实验比较(树形DP,容斥)
    题意:给你一棵树,你要对所有节点定一个顺序序列,形如\(p_1\oplus_1p_2\oplus_2p_3\cdotsp_{n-1}\oplus_{n-1}p_n\),其中\(\oplus_i\)为\(=\)或\(<\),\(p_{1\simn}......
  • 【HNOI_AHOI2018】排列(树上一类全序问题)
    这个条件给的有点诡异:对于任意的\(a_{p_j}=p_k\),都有\(k<j\)。那么对于某个\(a_x=y\),意思就是\(y\)在\(p\)中的位置小于\(x\)在\(p\)中的位置。那么如果我们......
  • 【HEOI2016_TJOI2016】排序(线段树分裂&合并)
    线段树分裂&合并入门题。对于每个单调段用一个权值线段树维护。一次操作相当于先对\(l,r\)所在的单调段的权值线段树分裂,然后再合并若干棵的权值线段树。线段树分裂和......