栈stack

  1. template<typename _Tp, typename _Sequence = deque<_Tp> >
  2. class stack

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

最上面的元素称为栈顶。

具体看看代码:

  1. // 返回这个栈是否为空
  2. bool
  3. empty() const
  4. { return c.empty(); }
  5. // 返回栈的大小
  6. size_type
  7. size() const
  8. { return c.size(); }
  9. // 返回栈顶元素
  10. reference
  11. top()
  12. {
  13. __glibcxx_requires_nonempty();
  14. return c.back();
  15. }
  16. // 返回栈顶元素
  17. const_reference
  18. top() const
  19. {
  20. __glibcxx_requires_nonempty();
  21. return c.back();
  22. }
  23. // 将一个元素压入栈,成为新的栈顶
  24. void
  25. push(const value_type& __x)
  26. { c.push_back(__x); }
  27. // 弹出栈顶元素
  28. void
  29. pop()
  30. {
  31. __glibcxx_requires_nonempty();
  32. c.pop_back();
  33. }

参考luogu.org的例题P1981

其实用队列也是可以的

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

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

  1. #include <cstdio>
  2. #include <stack>
  3. long long n,lst;
  4. using std::stack;
  5. char opt;
  6. stack <long long>plus;
  7. int main()
  8. {
  9. scanf("%lld",&lst);
  10. lst%=10000;
  11. while(scanf("%c%lld",&opt,&n)==2)
  12. {
  13. if(opt=='+')
  14. {
  15. plus.push(lst);
  16. lst=1;
  17. }
  18. lst=(lst*n)%10000;
  19. }
  20. plus.push(lst);
  21. long long ans=0;
  22. while(!plus.empty())
  23. {
  24. ans+=plus.top()-10000;
  25. plus.pop();
  26. ans+=(ans>>63)&10000;
  27. }
  28. printf("%lld\n",ans);
  29. return 0;
  30. }

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

队列queue

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

先进来的……就先走

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

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

  1. template<typename _Tp, typename _Sequence = deque<_Tp> >
  2. class queue
  1. // 返回当前队列是否为空
  2. bool
  3. empty() const
  4. { return c.empty(); }
  5. // 返回当前队列的大小
  6. size_type
  7. size() const
  8. { return c.size(); }
  9. // 返回队首元素
  10. reference
  11. front()
  12. {
  13. __glibcxx_requires_nonempty();
  14. return c.front();
  15. }
  16. const_reference
  17. front() const
  18. {
  19. __glibcxx_requires_nonempty();
  20. return c.front();
  21. }
  22. // 返回队尾元素
  23. reference
  24. back()
  25. {
  26. __glibcxx_requires_nonempty();
  27. return c.back();
  28. }
  29. const_reference
  30. back() const
  31. {
  32. __glibcxx_requires_nonempty();
  33. return c.back();
  34. }
  35. // 将元素入队尾
  36. void
  37. push(const value_type& __x)
  38. { c.push_back(__x); }
  39. // 弹出队首元素
  40. void
  41. pop()
  42. {
  43. __glibcxx_requires_nonempty();
  44. c.pop_front();
  45. }

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

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

参考luogu.org的例题P1540

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

  1. #include <cstdio>
  2. #include <queue>
  3. using std::queue;
  4. bool vis[1001];
  5. int n,m,ans,opt;
  6. queue<int> q;
  7. int main()
  8. {
  9. scanf("%d%d",&m,&n);
  10. while(n--)
  11. {
  12. scanf("%d",&opt);
  13. if(not vis[opt])
  14. {
  15. vis[opt]=true;
  16. ++ans;
  17. if(q.size()==m)
  18. {
  19. vis[q.front()]=false;
  20. q.pop();
  21. }
  22. q.push(opt);
  23. }
  24. }
  25. printf("%d\n",ans);
  26. return 0;
  27. }
  28. 与此同时还有优先队列priority_queue,每次保证队头元素一定是队列中最“大”的
  29. 也就是名副其实的大根堆
  30. 当然这个“大”也是你自己定义的
  31. ```cpp
  32. priority_queue<int,vector<int>,greater<int> > p;

就可以实现小根堆

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

列表List

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

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

那就过了

集合set

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

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

(当然可能会浪费时间。

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

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

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

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. set<int,greater<int> > s;
  4. int main()
  5. {
  6. s.insert(3);
  7. s.insert(2);
  8. s.insert(1);
  9. for(set<int>::iterator it = s.begin(); it != s.end();++it)
  10. {
  11. cout << *it << ' ';
  12. }
  13. return 0;
  14. }

一些成员函数……看资料

映射map

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

(但是操作很麻烦)

多重映射multimap

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

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

对pair

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

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

元组tuple

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

容器containers

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

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

算法algorithms

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

比如sort, erase, copy之类的

仿函数/函数对象functors

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

也不知道有什么用

  1. struct my_functor
  2. {
  3. operator()(int a,int b)
  4. {
  5. return a+b;
  6. }
  7. }

然后调用

  1. my_functor(1,2);

就会返回3

(不就是函数嘛)

迭代器iterator

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

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

就可以遍历整个vector

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

  1. template <typename T>
  2. 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. AspectJWeaver文件写入gadget详解和两种应用场景举例

    目录 0 前言 1 环境 2 gadget解析 2.1 高版本Commons-Collections的防御措施 2.2 获取AspectJWeaver的调用链 2.3 gadget详解 3 两种应用场 ...

  2. 洛谷P1603——斯诺登的密码(字符串处理)

    https://www.luogu.org/problem/show?pid=1603#sub 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事 ...

  3. 小程序跳转H5及其他页面

    一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息等场景中. ...

  4. ecshop 加入购物车和直接购买同时存在的方法

    一.首先将直接购买的链接设置为 <a href="javascript:bool =1;addToCart({$goods.goods_id})"> bool值为1,g ...

  5. Jmeter系列(24)- 常用逻辑控制器(3) | 模块控制器Module Controller

    模块控制器(Module Controller) 作用 可以理解为引用.调用执行的意思,调用范围为testplan树下任意的逻辑控制器,模块控制器除外 点开testplan树,需要引用哪个逻辑控制器选 ...

  6. Laravel [1045] Access denied for user 'homestead'@'localhost' .env没有配置

    laravel 连接数据库出现错误 PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denied for use ...

  7. php 常用算法与函数

    1.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...

  8. js运行机制 值引用 值传递

    1.js是单线程的  为什么是单线程的呢  因为js作为浏览器脚本语言,会有很多和用户的互动,以及操作dom,多个线程会出问题. 2.js有同步任务,异步任务(ajax,用户点击等,settimeou ...

  9. 聊聊并发(一)——初始JUC

    一.volatile 1.介绍 JDK 5.0 提供了java.util.concurrent包,在此包中增加了并发编程中很常用的使用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步IO和轻 ...

  10. C++学习笔记:07 类的继承与派生

    课程<C++语言程序设计进阶>清华大学 郑莉老师) 基本概念 继承与派生的区别: 继承:保持已有类的特性而构造新类的过程称为继承. 派生:在已有类的基础上新增自己的特性(函数方法.数据成员 ...