Vector:不定长数组

Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等。而且它在STL中时间效率也很高效:几乎与数组不相上下。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector> //定义头文件 using namespace std; vector<int> v; //定义一个vector数组,类型为int int main()
{
v.clear(); //清空vector
v.push_back(1); //从后端插入元素“1” int k=v[0]; //vector可以像数组一样读取
int len=v.size(); //返回vector数组长度 v.pop_back(); //从后端弹出元素 if (v.empty()) printf("The vector is empty!\n"); //检测vector是否为空,是则返回true,否则返回false vector<int>::iterator it; //定义迭代器 v.push_back(10); v.push_back(5); sort(v.begin(),v.end()); //vector也可排序,只是要用这种形式传递
for (it=v.begin();it!=v.end();it++) //遍历vector
printf("%d\n",*it);
return 0;
}

实际上vector还有push_front()等操作,但从前端插入会引起大量元素移动,浪费大量时间,不提倡使用。


SET:集合

C++里的集合SET就是数学上的集合:不允许重复元素。

另外,因为SET中元素是始终有序的,所以可用作某些“排序更新”类的操作。

#include <cstdio>
#include <set> //定义头文件
#include <algorithm>
#include <cstdlib> using namespace std; set<int> s; //定义SET int main()
{
s.clear(); //清空集合
s.insert(1); //插入元素“1”
if (s.count(1)) printf("Yes\n"); else printf("No\n"); //如果元素存在,返回true,否则返回false s.erase(1); //删除元素“1”
if (s.count(1)) printf("Yes\n"); else printf("No\n"); for (int i=0;i<6;i++)
s.insert(i); set<int>::iterator it; //迭代器 for (it=s.begin();it!=s.end();it++) //依次遍历
printf("%d\n",*it);
return 0;
}

尽管方便(实现红黑树?),但SET时间效率并不高,能别用还是别用吧……


Map:映射

map是一种“关联数组”,你可以把它看成两个数组之间的映射。

但这货实在用处不大 ( ̄o ̄) ,不仅速度慢的惊世骇俗,功能基本上数组也能实现……

具体用法和数组和SET差不多,不写了(蛤蛤)。


Stack:栈

栈就是一种简单数据结构,你可以把它想象成一挪碟子:先放的碟子后拿走,即“先进后出”。

#include <cstdio>
#include <stack> //头文件
#include <cstdlib> using namespace std; stack<int> s; //定义 int main()
{
if (s.empty()) printf("The stack is empty!\n"); //判断是否为空 s.push(1); //元素“1”入栈
printf("%d\n",s.top()); //取栈顶元素(不弹出)
s.pop(); //栈顶元素出栈 return 0;
}

速度还行 - (⊙ˍ⊙)


Queue:队列

队列类似于排队的顺序:先来排队的人先走人,即“先进先出”。

#include <cstdio>
#include <queue> //头文件
#include <cstdlib> using namespace std; queue<int> q; //定义 int main()
{
if (q.empty()) printf("The queue is empty!\n"); //判断是否为空 q.push(1); //元素“1”入栈队
printf("%d\n",q.front()); //取队尾元素(不弹出)
q.pop(); //队尾元素出队 return 0;
}

是不是和栈的操作很类似?


Deque:双端队列

双端队列是STL中queue的“高级版”,一般队列只支持从一个方向“先进后出”,而双端队列deque支持从两个方向插入和弹出元素

#include <queue>
#include <cstdio>
#include <cstdlib> using namespace std; int main()
{
deque<int> dq; //定义队列 dq.clear(); //清空队列 dq.push_back(1); //从尾部插入元素“1”
dq.push_front(4); //从头部插入元素“4” printf("%d\n",dq[0]); //使用数组方式读取
printf("%d\n",dq.size()); //返回队列元素个数
printf("%d\n",dq.front()); //返回队列首部元素
printf("%d\n",dq.back()); //返回队列尾部元素 deque<int>::iterator it=dq.begin(); //定义迭代器 for (it=dq.begin();it!=dq.end();it++) //依次遍历输出
printf("%d\n",*it); dq.pop_back(); //弹出队尾元素
printf("%d\n",dq.back());
dq.pop_front(); //弹出队首元素 if (dq.empty()) printf("The queue is empty! %d \n",dq.size()); //检查队列是否为空 system("pause");
return 0;
}

deque在首尾插入等操作方面是几乎不耗时的,但初始化就不一定了:据说有人测过n=10^6时要0.3秒? 还有没介绍的中间插入和删除,如果你用了,那么卡个评测机几分钟应该是没问题的……(原理就像vector,中间插入需要移动大量元素)

所以,还是那句话:能不用STL尽量别用,还是老老实实开数组或者用vector吧……


Priority_queue:优先队列

优先队列也是队列的一种,但它不是按进队顺序决定出队顺序,而是按一个用户自定义的“优先度”:在优先队列中:“优先度”大的元素先出队。

#include <cstdio>
#include <queue>
#include <cstdlib> using namespace std; struct cmp{ //仿函数(不能直接写)
bool operator() (const int a,const int b) {
return a%10 < b%10;
}
}; priority_queue<int,vector<int>,cmp> q; //注意它的定义:对于自定义的“优先度”,必须用这种方式定义 int main()
{
if (q.empty()) printf("Empty!\n"); //判断是否为空 for (int i=1;i<20;i++)
q.push(i); //入队
for (int i=1;i<20;i++)
{
printf("%d\n",q.top()); //队尾元素
q.pop(); //出队
}
return 0;
}

当两个元素优先度相同时,先入队的元素先出队。

当然,优先队列是拿堆写的。具体速度也不慢,但手写堆还是要快那么“一点点的”……


Multiset:多重集

与集合同理,只是允许多个相同值存在。

{
S.insert(x); //插入一个元素x
S.erase(x); //移除S中所有的x
S.erase(S.find(x)); //移除S中的一个x
}

Bitset:压位集合

可以自定义长度的整数集合,所有操作复杂度为\(O(n/32)\)

#include <cstdio>
#include <bitset> const int maxn=100000+10; bitset<maxn> S; //定义[0,maxn)的bitset int main()
{
S[0]=1,S[1]=1; //直接赋值
if (S.any()) printf("YES\n"); //如果有二进制位为1,返回true,否则返回false
int k=S.count(); //二进制位为1的个数 S.flip(); //所有二进制位取反
S.set(); //所有二进制位设为1
S.reset(); //所有二进制位设为0 /*
bitset还可以直接使用整数的二进制运算,如&,^,|,<<,>>
*/ return 0;
}

STL的使用的更多相关文章

  1. STL Queue 容器

    STL Queue 容器 Queue简介         queue是队列容器,是一种“先进先出”的容器.         queue是简单地装饰deque容器而成为另外的一种容器.        # ...

  2. 浅谈C++ STL queue 容器

    浅谈C++ STL queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(queue\)容器的使用方法和常见的使用技巧.\(queue\)容器是\(C++STL\)的一种比较基本的容器.我们 ...

  3. C++ STL - queue常见函数使用解析

    C++ STL - queue常见函数使用解析 c++队列模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque ...

  4. STL<queue>的使用

    队列是一种基本的线性数据结构.它满足先进先出(First In ,First Out)的原则. 我们可以应用这种数据结构实现很多复杂的问题.但每次要手写队列的相关函数并不省事,我们便可以应用STL中的 ...

  5. STL queue 常见用法详解

    <算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...

  6. C++标准模板库(STL)——queue常见用法详解

    queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...

  7. 2.6 C++STL queue详解

    文章目录 2.6.1 引入 2.6.2 代码示例 2.6.3 代码运行结果 总结 2.6.1 引入 首先,在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(a ...

  8. STL --> queue单向队列

    queue单向队列 queue 模板类的定义在<queue>头文件中.与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器 ...

  9. STL - queue(队列)

    Queue简介 queue是队列容器,是一种"先进先出"的容器. queue是简单地装饰deque容器而成为另外的一种容器. #include <queue> queu ...

  10. STL queue用法

    先进先出 #include<iostream> #include<algorithm> #include<cstdio> #include<stack> ...

随机推荐

  1. UIScrollView的封装

    UIScrollView的封装 效果 特点 1.用法简单,尺寸大小,随意设置位置 2.可以有多个数据源的数据,可以定制不通的界面(如同上图,一个有文字,一个没有文字) 3.能够实现点击事件 用法 1. ...

  2. linux输入子系统(input subsystem)之按键输入和LED控制

    实验现象:在控制台打印按键值,并且通过按键控制相应的LED亮灭. 1.代码 input_subsys_drv.c #include <linux/module.h> #include &l ...

  3. 虚拟机Linux----Ubuntu1404----root登录设置

    说明:在安装玩1404这个版本的ubuntu后,默认也是看不到root登录的,也需要修改配置文件,但是修改的文件和1204不太一样. 1.shell窗口,普通用户首先登录,切换到root用户下: su ...

  4. JMeter常见问题集合

    前言 本文内容仅仅是针对Jmeter的部分功能名词的介绍和解释,以及初学者不易理解的问题的整理.部分内容来自别人做的整理,为了更好地整理自己的思路,所以可耻的整理一下发到博客上. 标题[1-6]和[参 ...

  5. UVA10325 The Lottery(容斥原理)

    题意: 给n,m,和m个数(k1~km).求1~n中有多少个数不是(k1~km)中任意一数的倍数. 题解: 容斥模板题.反面考虑,a的倍数有n/a个:既是a,也是b的倍数,即lcm(a,b)的倍数有n ...

  6. <编程珠玑>笔记 (一) 问题-算法-数据结构

    1  精确描述问题 第一章强调的重点在于”精确的描述问题“,这是程序开发的第一步 -- "Problem definition" 1.1  Precise problem stat ...

  7. sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法

    http://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库 ...

  8. C++函数指针总结

    学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了.本博文详细介绍一下常见的各种坑爹的函数指针. 至于指针的详细学习,推荐这篇博文C++指针详解 与数据一样,函 ...

  9. [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  10. Webwork 学习之路【08】结合实战简析Controller 配置

    虽然现在 MVC 框架层出不穷,但做为 Struts 前身的 webwork. 其经典程度不亚于贝利之于足球,双 11 之于淘宝特卖. 本篇将结合 webwork controller 配置文件 xw ...