栈stack

template<typename _Tp, typename _Sequence = deque<_Tp> >
class stack

先入后出,只有一边开口,可以理解为箱子,先放进去的压箱底,后放进去的就在上面,会被先拿出来。

最上面的元素称为栈顶。

具体看看代码:

// 返回这个栈是否为空
bool
empty() const
{ return c.empty(); } // 返回栈的大小
size_type
size() const
{ return c.size(); } // 返回栈顶元素
reference
top()
{
__glibcxx_requires_nonempty();
return c.back();
} // 返回栈顶元素
const_reference
top() const
{
__glibcxx_requires_nonempty();
return c.back();
} // 将一个元素压入栈,成为新的栈顶
void
push(const value_type& __x)
{ c.push_back(__x); } // 弹出栈顶元素
void
pop()
{
__glibcxx_requires_nonempty();
c.pop_back();
}

参考luogu.org的例题P1981

其实用队列也是可以的

对于里面所有的乘法先进行运算,这样出来的结果就会是一堆数相加。

所以把要相加的数先压入栈,然后最后再统一加上

#include <cstdio>
#include <stack>
long long n,lst;
using std::stack;
char opt;
stack <long long>plus;
int main()
{
scanf("%lld",&lst);
lst%=10000;
while(scanf("%c%lld",&opt,&n)==2)
{
if(opt=='+')
{
plus.push(lst);
lst=1;
}
lst=(lst*n)%10000;
}
plus.push(lst);
long long ans=0;
while(!plus.empty())
{
ans+=plus.top()-10000;
plus.pop();
ans+=(ans>>63)&10000;
}
printf("%lld\n",ans);
return 0;
}

(仓促代码别想了肯定丑)

队列queue

就像真的排队一样,先进先出

先进来的……就先走

队首第一个元素就是将要被弹出的元素。

队尾的最后一个元素就是刚入队的元素

 template<typename _Tp, typename _Sequence = deque<_Tp> >
class queue
// 返回当前队列是否为空
bool
empty() const
{ return c.empty(); } // 返回当前队列的大小
size_type
size() const
{ return c.size(); } // 返回队首元素
reference
front()
{
__glibcxx_requires_nonempty();
return c.front();
} const_reference
front() const
{
__glibcxx_requires_nonempty();
return c.front();
} // 返回队尾元素
reference
back()
{
__glibcxx_requires_nonempty();
return c.back();
} const_reference
back() const
{
__glibcxx_requires_nonempty();
return c.back();
} // 将元素入队尾
void
push(const value_type& __x)
{ c.push_back(__x); } // 弹出队首元素
void
pop()
{
__glibcxx_requires_nonempty();
c.pop_front();
}

与此同时还有双端队列deque,和queue的用法差不多,但是支持双端队列操作。

有函数push_front();pop_front();push_back();pop_back();

参考luogu.org的例题P1540

因为这里也需要先入先出的属性,所以使用队列

#include <cstdio>
#include <queue>
using std::queue;
bool vis[1001];
int n,m,ans,opt;
queue<int> q; int main()
{
scanf("%d%d",&m,&n);
while(n--)
{
scanf("%d",&opt);
if(not vis[opt])
{
vis[opt]=true;
++ans;
if(q.size()==m)
{
vis[q.front()]=false;
q.pop();
}
q.push(opt);
}
}
printf("%d\n",ans);
return 0;
} 与此同时还有优先队列priority_queue,每次保证队头元素一定是队列中最“大”的
也就是名副其实的大根堆
当然这个“大”也是你自己定义的
```cpp
priority_queue<int,vector<int>,greater<int> > p;

就可以实现小根堆

最后的greater也可以替换为自己定义的比较函数指针

列表List

嗯,这篇文章讲得很好(逃

然后我也没找到好的例题……

那就过了

集合set

他非常好满足了集合的特点:互异性

如果你重复插入某个元素和只插入一次是没有区别的。

(当然可能会浪费时间。

底层实现是红黑树,我不会(诚实)

所以他的数据是有序的!(如果你用迭代器遍历的话)

默认升序,也可以修改为降序

也可以使用反向迭代器reverse_iterator遍历,这样顺序就反过来了。

#include <bits/stdc++.h>
using namespace std;
set<int,greater<int> > s; int main()
{
s.insert(3);
s.insert(2);
s.insert(1);
for(set<int>::iterator it = s.begin(); it != s.end();++it)
{
cout << *it << ' ';
}
return 0;
}

一些成员函数……看资料

映射map

对于每一个给定的键key都有唯一对应的值val.可以理解为数组,但是无论时间还是空间上都比数组快

(但是操作很麻烦)

多重映射multimap

对于每个给定的键key可以有多个对应的值val,但是同样不怎么实用。

好好地有数组不用用什么STL

对pair

给定两个参数类型,构造一对打包的数据类型

pair<int, int> a;
a.first;
a.second;
a=make_pair(1,2);

元组tuple

别看了c++11专用考试c++98用不上

容器containers

不是一个确切的函数,是一类模板

STL封装好的容器有vector, deque, list等

算法algorithms

就是STL里面好多好多的内置函数

比如sort, erase, copy之类的

仿函数/函数对象functors

是用结构体实现函数功能。

也不知道有什么用

struct my_functor
{
operator()(int a,int b)
{
return a+b;
}
}

然后调用

my_functor(1,2);

就会返回3

(不就是函数嘛)

迭代器iterator

很多很多类class/容器containers都自带的东西,用来遍历整个类/容器

vector<int> a;
while(cin >> x) a.push_back(x);
for(vector<int>::iterator it=a.begin(); it!=a.end();++it) cout << *it << endl;

就可以遍历整个vector

这里很容易看出iterator是定义在

template <typename T>
class vector<T>;

里面的一个子类/结构体

STL模板的更多相关文章

  1. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

  2. DLL中导出STL模板类的问题

    接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...

  3. STL模板_容器概念

    一.STL(Standard Template Library,标准模板库)概述1.容器:基于泛型的数据结构.2.算法:基于泛型的常用算法.3.迭代器:以泛型的方式访问容器中的元素,是泛型的算法可以应 ...

  4. STL模板_概念

    模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...

  5. C++STL模板库序列容器之vector

    目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...

  6. c++ STL模板(一)

    一.sort函数 1.头文件:#include < algorithm>: 2.它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n): 3.Sort函数有三个参数:(第三个参 ...

  7. STL模板整理 Binary search(二分查找)

    前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorith ...

  8. STL模板整理 vector

    一.什么是标准模板库(STL)? 1.C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板, ...

  9. C++面试笔记--STL模板与容器

    1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vec ...

  10. 从零开始写STL—模板元编程之any

    any class any; (since C++17) The class any describes a type-safe container for single values of any ...

随机推荐

  1. 从零开始学习SQL SERVER(2)--- 基本操作及语句

    声明:仅为本人随笔及经验之谈,有错误敬请指出. # 后的文字为注释 Microsoft SQL Server Management Studio 中的SQL命令 添加数据库 1 CREATE DATA ...

  2. 谈谈Linux系统启动流程

    @ 目录 大体流程分析 一.BIOS 1.1 BIOS简介 1.2 POST 二.BootLoader (GRUB) 2.1 What's MBR? 2.2 What's GRUB? 2.3 boot ...

  3. 【转载】linux 工作队列上睡眠的认识--不要在默认共享队列上睡眠

    最近项目组做xen底层,我已经被完爆无数遍了,关键在于对内核.驱动这块不熟悉,导致分析xen代码非常吃力.于是准备细细的将 几本 linux 书籍慢慢啃啃. 正好看到LINUX内核设计与实现,对于内核 ...

  4. STM32,下载HAL库写的代码后J-Link识别不到芯片,必须要按住复位才能下载?

    问题描述:最近在学STM32的HAL库,据说可以统一STM32江湖,前途无量.最近一段时间参照STM32CubeMX和原子的资料自己学着建了两个HAL库的工程模板,F4的还好说,F1的出现了一个玄学问 ...

  5. 新环境c7、php7.4、openssl1.1.1g,再discuz里发送邮件总是报ssl连接不上

    Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL r ...

  6. Qt中的ui文件转换为py文件

    将pyuic5 -o demo.py demo.ui写入ui-py.bat文件(自定义文件),将ui文件与ui-py.bat文件放在同一文件夹,双击.bat文件即可生成.py文件

  7. CF204E-Little Elephant and Strings【广义SAM,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/CF204E 题目大意 \(n\)个字符串的一个字符串集合,对于每个字符串求有多少个子串是这个字符串集合中至少\(k\ ...

  8. .Net Core利用反射动态加载类库的方法(解决类库不包含Nuget依赖包的问题)

    在.Net Framework时代,生成类库只需将类库项目编译好,然后拷贝到其他项目,即可引用或动态加载,相对来说,比较简单.但到了.Net Core时代,动态加载第三方类库,则稍微麻烦一些. 一.类 ...

  9. 分布式、微服务必须配个日志管理系统才优秀,Exceptionless走起~~~

    前言 在真实的项目中,不管是功能日志.错误日志还是异常日志,已经是项目的重要组成部分.在原始的单体架构,通常看日志的方式简单粗暴,直接登录到服务器,把日志文件拷贝下来进行分析:而如今分布式.微服务架构 ...

  10. Vue组件间的数据传输

    1.父组件向子组件传输数据:自定义属性 1 //父组件 2 <Son :msg="message" :user="userinfo"></So ...