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. iOS - 捕获应用程序崩溃日志

    作为一名iOS移动应用开发者,为了确保你的应用程序正确无误,在将应用程序提交到应用商店之前,你必定会进行大量的测试工作:而且在你测试的过程中应用程序运行的很好,但是在应用商店上线之后,还是有用户抱怨应 ...

  2. Service是什么?Service又不是什么?

    在Android王国中,Service是一个劳动模范,总是默默的在后台运行,无怨无悔,且总是干最脏最累的活,比如下载文件,倾听音乐,网络操作等这些耗时的操作,所以我们请尊重的叫他一声:"劳模 ...

  3. Elixir - Hey, two great tastes that go great together!

    这是Elixir的作者 José Valim 参与的一次技术访谈,很有料,我们可以了解Elixir的一些设计初衷,目标等等. 原文在: http://rubyrogues.com/114-rr-eli ...

  4. 15天玩转redis —— 第九篇 发布/订阅模式

    本系列已经过半了,这一篇我们来看看redis好玩的发布订阅模式,其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果 ...

  5. Linux运维之基础拾遗

    第一部分 Linux常用文件管理命令 1.1 cp 文件复制 常用选项 -i # 覆盖之前提醒用户确认 -f # 强制覆盖目标文件 -r # 递归复制目录 -d # 复制符号链接本身而非其指向的源文件 ...

  6. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  7. chkconfig

    chkconfig的级别: 0:关机 1:单用户模式 2:无网络支持的多用户模式 3:有网络支持的多用户模式 4:保留,未使用 5:有网络支持有X-Windows(图形界面)支持的多用户模式 6:重新 ...

  8. linux命令在线手册

    下面几个网址有一些 Linux命令的在线手册,而且还是中文的,还可以搜索.非常方便 Linux命令手册 Linux命令大全 Linux中文man在线手册 每日一linux命令

  9. Hash 函数及其重要性

    不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...

  10. 【JS/CSS3】实现带预览图幻灯片效果~

    一.前期准备 1.1 案例分析 适用场景:单例布局1.2 方法论 V视图 HTML+CSS+调试C js实现控制流程D数据 优化扩展 二.代码 结构 <div class="slide ...