ACM竞赛中STL的应用

合集下载

ACM竞赛所用数据结构

ACM竞赛所用数据结构
ACM竞赛所用数据结构
平衡树AVL
BST受输入顺序影响
最好O(log n) 最坏O(n^2)
怎样使得BST始终保持O(log n)级的平衡状态?
Adelson-Velskii和Landis发明了AVL树
一种平衡的二叉搜索树 任何结点的左子树和右子树高度最多相差1
ACM竞赛所用数据结构
– 插入:tree.insert(val); multiset返回bool; set返回pair其 中.second表示是否插入成功, .first表示新元素或现存同值元 素的位置。
– 改变:该类型内容是只读的,不能改变 – 查找:tree.find(val);返回值为val的第一个元素的迭代器;
}
return -1;
}
ACM竞赛所用数据结构
串的模式匹配--BM
快速的字符串查找算法 Boyer-Moore算法 BM 算法是一个较优的模式匹配算法。一般,如果
不考虑模式串的长度,一个具有时间复杂度O(n)的 算法应该是最优的了,但是事实不是如此。BM算 法可以实现更高效率的模式匹配。分析和实验说明, BM匹配算法对于那些字符集比较大,而模式串中 出现的字符比较少的时候,工作效率最快。而且, 考虑KMP匹配方式的优化,可以结合KMP匹配和 BM匹配,进一步提高效率。
while(a[--j]>x);
if (i<j) tmp=a[i],a[i]=a[j],a[j]=tmp;
}
if (j==e) j--;
i=j-b+1;
if (k<=i) return select(a,b,j,k);
else return select(a,j+1,e,k-i);
}

STL的熟悉与使用

STL的熟悉与使用

STL的熟悉与使用STL(Standard Template Library)是C++标准库中提供的一个功能强大的通用模板库,它包含了许多常用的数据结构和算法。

STL的熟悉与使用对于C++程序员来说非常重要,可以极大地提高开发效率和代码的质量。

本文将介绍STL的基本概念、常用数据结构和算法,以及如何进行STL的使用。

STL的基本概念:1. 容器(Containers):STL中的容器是用来存储数据的类模板,包括序列容器(vector、deque、list)和关联容器(set、map、multiset、multimap)。

容器可以分为序列容器和关联容器,其中序列容器是线性存储的,关联容器是使用键值对存储的。

2. 迭代器(Iterators):STL中的迭代器类似于指针,用来遍历容器中的元素。

迭代器提供了一种统一的访问容器元素的方式,可以通过自增和自减操作实现对容器元素的顺序访问。

3. 算法(Algorithms):STL中提供了大量的算法,包括查找、排序、复制、填充等。

算法可以直接操作容器中的元素,它们是通过迭代器来实现的,所以使用算法需要利用容器的迭代器对容器中的元素进行操作。

4. 函数对象(Function Objects):STL中的函数对象是一种可以像函数一样被调用的对象。

STL中的很多算法需要传递函数对象来实现特定的功能,函数对象可以是函数指针、函数对象类或者是函数对象适配器。

STL常用数据结构和算法:1. vector:动态数组,支持随机访问和快速的尾部插入和删除,可以用来代替数组。

2. list:双向链表,支持快速的插入和删除操作,但不支持随机访问。

3. set:集合,其中的元素是有序且独一无二的,可以进行插入、删除和查找操作,内部通过红黑树实现。

4. map:映射,包含一系列的键值对,其中的键是有序且独一无二的,可以进行插入、删除和查找操作,内部通过红黑树实现。

5. sort:对容器中的元素进行排序,内部使用快速排序算法。

STL文件数据结构优化研究及应用

STL文件数据结构优化研究及应用

STL文件数据结构优化研究及应用随着3D打印技术的发展,STL文件已成为三维模型过程中最常用的文件格式。

然而,在大部分情况下,STL文件存在着一些问题,比如文件大小过大、模型质量低下等。

为了解决这些问题,人们开始关注STL文件数据结构优化这一领域。

本文将探讨STL文件数据结构优化的研究及其在实际应用中的运用。

一、STL文件概述STL文件是三维打印过程中的一种标准格式。

它包含了模型的几何信息,用于生成可打印的G-code文件。

在STL文件中,模型被分解成多个三角形面片,每个面片由三个点确定。

由于STL文件的简洁性和通用性,它在多个行业中得到了广泛的应用。

然而,STL文件也存在着一些问题。

首先,STL文件中的每个三角形面片都需要包含三个顶点的坐标信息,因此文件大小通常比较大。

其次,STL文件中的面片数量较多,导致在模型加工和应用过程中速度较慢。

此外,由于STL文件没有法线数据,因此在模型渲染后可能出现光照效果不佳等问。

为了解决这些问题,人们开始研究STL文件数据结构优化。

二、STL文件数据结构优化研究1.数据压缩对于STL文件而言,其数据量巨大是导致其不稳定和不便于保存的主要原因之一。

为了解决这个问题,压缩技术被普遍应用于STL文件的处理中。

通过去掉文件中的冗余信息,减少文件体积,使得文件传输速度更快,使用更方便。

2.数据分层在STL文件中,三角面片的数量很大,导致模型加工和应用过程中速度较慢。

为了加快处理速度,一些优化方法被引入了。

数据分层是其中一种常用的方法。

通过将模型分为多个“分层”,使得在加工和应用过程中能够根据需要只对某些“分层”进行计算和操作,从而减少了处理时间。

3.数据优化在STL文件中,三角形面片的质量对于模型的几何精度及光照效果非常重要。

为了优化STL文件的几何数据,一些算法被提出。

这些算法能够对不良三角形进行自动修复,并对面片进行局部重构,以获得更高质量的STL文件。

三、STL文件数据结构优化的应用1. 3D打印在3D打印过程中,STL文件中的每个面片被打印成一层。

讲STL

讲STL

for(i=0;i<len;i++) cin>>a[i]; sort(a,a+len); for(i=0;i<len;i++) cout<<a[i]<<endl; cin>>len; } return 0; }
由此可见调用STL中的函数,很方便的对数组进 行排序了,从时间上比你去写冒泡排序或其它 排序快的多吧. sort不仅可以对数组进行排序,还可以对结构体 进行排序,只需对 < 进行重载.
结构体的栈 typedef struct Point { int x, y; }POINT; stack <POINT> mystack;
栈的应用 进制间的转换 OJ上的题ID_1009 (STL_stack.cpp)
list
#include<list> using namespace std; list<type> mylist; mylist.front(); mylist.push(x); mylist.pop();
#include<iostream> #include<algorithm> using namespace std; int main(int argc, char *argv[]) { int n; char str[10]="123456789", *start, *end; cin>>n; start = str;
这只是个介绍
更多详情,请访问 /
各位还有什么问题? 各位还有什么问题
敬请提出
THANK YOU!
map
map<int,bool>::iterator it; my.erase(it); it=my.lower_bound(v[i]); it--; it++;

STL在《算法设计与分析》课程中的应用

STL在《算法设计与分析》课程中的应用

The Application of STL in the Course of Algorithm Design and Analysis
ZHANG Tianwu, WU Qihang
(College of Computer, Henan University of Engineering, Xinzheng, China, 451191)
与解决问题的能力,使学生能够理解经典算法的基 Musser等人设计的一套软件的总称。因为这些软件
本思想,并能将所学算法进行灵活应用,真正解决 实际问题。然而该课程不但内容枯燥抽象,而且要
的高质量和高可靠性,它们被陆续收入到C++标 准库之中[4]。随着计算机技术的发展,STL的应用
求学生具有较强的编程能力,因此,对于一般的普 越来越广泛。STL包括大量数据结构和常用算法,
(4) 强调实验和动手能力的培养:算法讲解不 仅包含思路描述,而且以 C/C++完整源代码呈现,
不再是简单的伪代码描述,同时给出了大量的上机 实验题和在线编程题,大部分是国内外的著名 IT 企业面试题和 ACM 竞赛题,这是很多传统教材所 不能比拟的。
4 课堂教学
STL 应用于《算法设计与分析》的教学,非常 方便,但是 STL 包含内容很多,要想全部熟练掌握 STL 绝非易事,只要在教学过程中根据具体算法内 容讲解相关 STL 内容,大部分学生都能很快掌握利 用基本的 STL 技术进行编程。
比如使用 STL 中的 sort 算法实现整数型数组 b 的递增排序相关代码如下:
#include<iostream> #include <algorithm> using n,7,9,2,5,4,1,3,6,8};

STL中sort函数用法简介

STL中sort函数用法简介

STL中sort函数用法简介做ACM题的时候,排序是一种经常要用到的操作。

如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。

STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。

使用这个函数,需要包含头文件。

这个函数可以传两个参数或三个参数。

第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。

也就是说,排序的区间是[a,b)。

简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。

拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);对向量v排序也差不多,sort(v.begin(),v.end());排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。

如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。

比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。

想把刚才的整数数组按降序排列,可以先定义一个比较函数cmpbool cmp(int a,int b){return a>b;}排序的时候就写sort(a,a+100,cmp);假设自己定义了一个结构体nodestruct node{int a;int b;double c;}有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。

就可以写这样一个比较函数:以下是代码片段:bool cmp(node x,node y){if(x.a!=y.a) return x.aif(x.b!=y.b) return x.b>y.b;return return x.c>y.c;}排序时写sort(arr,a+100,cmp);最后看一个完整的实例,初赛时的一道题目“文件名排序”。

ACM竞赛中所用到的数据结构_非常不错_和大家分享汇总

ACM竞赛中所用到的数据结构_非常不错_和大家分享汇总

堆栈Stack
#include<stack> using namespace std; //STL stack <int> S;
链表list
特点:
插入O(k)
删除O(k)
查找O(k)
最坏情况下都是O(n)
实现方法:
链表
数组->改进块状数组
STL
链表list
#include<list> using namespace std; //STL list<int> S;
串的模式匹配--BM
算法的关键和 KMP 类似,也是构造一个辅助数组, 不过,不同于KMP算法的是,BM算法的辅助数组 大小只和匹配串的字符集大小相关(一般情况下也 就是ASCII字符集,256个字符),其内容和模式串 相关,辅助数组的内容即是模式串的索引: position[patten[i]]=i; 也是相当简单的辅助数组构造。
关于堆 Heap
二叉堆(又名最大/最小堆) 二项堆 映射2分堆 Fibonacci堆 Interval heap 左偏树Leftist Tree
队列Queue
特点:
先进先出 FIFO 入队O(1), 出队O(1) 不能随机访问中间的元素
实现方法:
链表 数组 STL
队列Queue
串的模式匹配--KMP
// start matching pattern T in S[i..)
// return match pos or longest match length with corresponding pos
int kmp(char *s, int ls, char *t, int lt, int i,int &longest,int &lp)

ACM_ICPC竞赛中sort函数的简要介绍

ACM_ICPC竞赛中sort函数的简要介绍

Electronic Technology & Software Engineering 电子技术与软件工程• 227Program Design •程序设计【关键词】sort 函数 程序设计1 sort函数的介绍及优点sort 函数是STL 中用于对给定区间进行排序的函数,所在头文件是#include<algorithm>。

主要原理是快速排序,但又不是简单的快速排序,它还结合了插入排序和堆排序,根据需要排序对象的不同情况,自动选用合适的排序方法。

所以虽然理论上sort 函数和快速排序的复杂度都是O(n*logn),但在实际应用中,sort 函数比快速排序的效率更高,实用方法简单,因此更加实用。

2 sort函数的使用方法sort 函数有三个参数(1)要排序数组的起始地址。

(2)要排序数组的结束地址,即最后一个要排序地址的下一个地址。

(3)排序方法,可以是从大到小,也可以自定义,也可以不写,如果不写,默认的排序方式是从小到大排序。

sort 函数使用模板是:sort(start,end,cmp);对区间[first,last)根据cmp 的方式进行排序。

3 sort函数的用法举例3.1 直接使用整型默认为从小到大排序,字符型根据ASCII 码值进行排序。

int a[N];sort(a+first,a+last);N 为整型常数,first 为起始地址,last 为结束地址。

3.2 自定义排序ACM_ICPC 竞赛中sort 函数的简要介绍文/焦静颐 崔驭 贾子璇3.2.1 自定义比较函数int a[N];bool cmp(int x,int y){return x>y;}sort(a+first,a+last,cmp);系统默认为x>y 返回true ,故程序是从大到小排序。

3.2.2 重载比较运算符这种方法用于结构体中。

struct point {int a,b;}e[N];bool operator<(const point& x,const point& y){if(x.a==y.a) return x.b<y.b; return x.a>y.a;}sort(e+first,e+last);根据成员a 的数值由大到小排序,当a 的数值相同时,根据成员b 的数值由小到大排序。

-【精品资料】ACM大赛必备_常用函数整理_ACM模板(整理版)

-【精品资料】ACM大赛必备_常用函数整理_ACM模板(整理版)

目录一、数学问题 (4)1.精度计算——大数阶乘 (4)2.精度计算——乘法(大数乘小数) (4)3.精度计算——乘法(大数乘大数) (5)4.精度计算——加法 (6)5.精度计算——减法 (7)6.任意进制转换 (8)7.最大公约数、最小公倍数 (9)8.组合序列 (10)9.快速傅立叶变换(FFT) (10)10.Ronberg 算法计算积分 (12)11.行列式计算 (14)12.求排列组合数 (15)13.求某一天星期几 (15)14.卡特兰(Catalan) 数列原理 (16)15.杨辉三角 (16)16.全排列 (17)17.匈牙利算法----最大匹配问题 (18)18.最佳匹配KM 算法 (20)二、字符串处理 (22)1.字符串替换 (22)2.字符串查找 (23)3.字符串截取 (24)4.LCS-最大公共子串长度 (24)5.LCS-最大公共子串长度 (25)6.数字转换为字符 (26)三、计算几何 (27)1.叉乘法求任意多边形面积 (27)2.求三角形面积 (27)3.两矢量间角度 (28)4.两点距离(2D、3D) (28)5.射向法判断点是否在多边形内部 (29)6.判断点是否在线段上 (30)7.判断两线段是否相交 (31)8.判断线段与直线是否相交 (32)9.点到线段最短距离 (32)10.求两直线的交点 (33)11.判断一个封闭图形是凹集还是凸集 (34)12.Graham 扫描法寻找凸包 (35)13.求两条线段的交点 (36)四、数论 (37)1.x 的二进制长度 (37)2.返回x 的二进制表示中从低到高的第i 位 (38)3.模取幂运算 (38)4.求解模线性方程 (39)5.求解模线性方程组(中国余数定理) (39)6.筛法素数产生器 (40)7.判断一个数是否素数 (41)8.求距阵最大和 (42)8.求一个数每一位相加之和 (43)10.质因数分解 (43)11.高斯消元法解线性方程组 (44)五、图论 (45)1.Prim 算法求最小生成树................................................. 45 2.Dijkstra 算法求单源最短路径.. (46)3.Bellman-ford 算法求单源最短路径 (47)4.Floyd-Warshall 算法求每对节点间最短路径 (48)5.解欧拉图 (49)六、排序/查找 (50)1.快速排序 (50)2.希尔排序 (51)3.选择法排序 (52)4.二分查找 (52)七、数据结构 (53)1.顺序队列 (53)2.顺序栈 (56)3.链表 (59)4.链栈 (63)5.二叉树 (66)八、高精度运算专题 (68)1.专题函数说明 (68)2.高精度数比较 (69)3.高精度数加法 (69)4.高精度数减法 (70)5.高精度乘10 (71)6.高精度乘单精度 (71)7.高精度乘高精度 (72)8.高精度除单精度 (72)9.高精度除高精度 (73)九、标准模板库的使用 (74)1.计算求和 (74)2.求数组中的最大值 (76)3. sort 和qsort (76)十、其他 (78)1.运行时间计算 (78)DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD一、数学问题1.精度计算——大数阶乘语法:int result=factorial(int n);参数:n:n 的阶乘返回值:阶乘结果的位数注意:本程序直接输出n!的结果,需要返回结果请保留long a[] 需要math.h源程序:int factorial(int n){long a[10000];int i,j,l,c,m=0,w;a[0]=1;for(i=1;i<=n;i++){c=0;for(j=0;j<=m;j++){a[j]=a[j]*i+c;c=a[j]/10000;a[j]=a[j]%10000;}if(c>0) {m++;a[m]=c;}}w=m*4+log10(a[m])+1;printf("\n%ld",a[m]);for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);return w;}我也可以做到..5 / 782.精度计算——乘法(大数乘小数)语法:mult(char c[],char t[],int m);参数:c[]:被乘数,用字符串表示,位数不限t[]:结果,用字符串表示m:乘数,限定10 以内返回值:null注意:需要string.h源程序:void mult(char c[],char t[],int m){int i,l,k,flag,add=0;char s[100];l=strlen(c);for (i=0;i<l;i++)s[l-i-1]=c[i]-'0';for (i=0;i<l;i++){k=s[i]*m+add;if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else{s[i]=k;flag=0;add=0;}}if (flag) {l=i+1;s[i]=add;} else l=i;for (i=0;i<l;i++)t[l-1-i]=s[i]+'0'; t[l]='\0';}3.精度计算——乘法(大数乘大数)语法:mult(char a[],char b[],char s[]);参数:a[]:被乘数,用字符串表示,位数不限b[]:乘数,用字符串表示,位数不限t[]:结果,用字符串表示返回值:null注意:空间复杂度为o(n^2)需要string.h源程序:void mult(char a[],char b[],char s[]){我也可以做到..6 / 78int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; char result[65];alen=strlen(a);blen=strlen(b);for (i=0;i<alen;i++)for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');for (i=alen-1;i>=0;i--){for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j]; result[k]=sum%10;k=k+1;sum=sum/10;}for (i=blen-2;i>=0;i--){for (j=0;j<=i;j++) sum=sum+res[i-j][j];result[k]=sum%10;k=k+1;sum=sum/10;}if (sum!=0) {result[k]=sum;k=k+1;}for (i=0;i<k;i++) result[i]+='0';for (i=k-1;i>=0;i--) s[i]=result[k-1-i];s[k]='\0';while(1){if (strlen(s)!=strlen(a)&&s[0]=='0')strcpy(s,s+1);elsebreak;}}4.精度计算——加法语法:add(char a[],char b[],char s[]);参数:a[]:被加数,用字符串表示,位数不限b[]:加数,用字符串表示,位数不限s[]:结果,用字符串表示返回值:null注意:空间复杂度为o(n^2)我也可以做到..7 / 78需要string.hDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD源程序:void add(char a[],char b[],char back[]){int i,j,k,up,x,y,z,l;char *c;if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2; c=(char *) malloc(l*sizeof(char));i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i>=0||j>=0){if(i<0) x='0'; else x=a[i];if(j<0) y='0'; else y=b[j];z=x-'0'+y-'0';if(up) z+=1;if(z>9) {up=1;z%=10;} else up=0;c[k++]=z+'0';i--;j--;}if(up) c[k++]='1';i=0;c[k]='\0';for(k-=1;k>=0;k--)back[i++]=c[k];back[i]='\0';}5.精度计算——减法语法:sub(char s1[],char s2[],char t[]);参数:s1[]:被减数,用字符串表示,位数不限s2[]:减数,用字符串表示,位数不限t[]:结果,用字符串表示返回值:null注意:默认s1>=s2,程序未处理负数情况需要string.h源程序:void sub(char s1[],char s2[],char t[])我也可以做到..8 / 78{int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);t[l1]='\0';l1--;for (i=l2-1;i>=0;i--,l1--){if (s1[l1]-s2[i]>=0)t[l1]=s1[l1]-s2[i]+'0';else{t[l1]=10+s1[l1]-s2[i]+'0';s1[l1-1]=s1[l1-1]-1;}}k=l1;while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}while(l1>=0) {t[l1]=s1[l1];l1--;}loop:if (t[0]=='0') {l1=strlen(s1);for (i=0;i<l1-1;i++) t[i]=t[i+1];t[l1-1]='\0';goto loop;}if (strlen(t)==0) {t[0]='0';t[1]='\0';}}6.任意进制转换语法:conversion(char s1[],char s2[],char t[]);参数:s[]:转换前的数字s2[]:转换后的数字d1:原进制数d2:需要转换到的进制数返回值:null注意:高于9 的位数用大写'A'~'Z'表示,2~16 位进制通过验证源程序:void conversion(char s[],char s2[],long d1,long d2){我也可以做到..9 / 78long i,j,t,num;char c;num=0;for (i=0;s[i]!='\0';i++){if (s[i]<='9'&&s[i]>='0') t=s[i]-'0'; else t=s[i]-'A'+10;num=num*d1+t;}i=0;while(1){t=num%d2;if (t<=9) s2[i]=t+'0'; else s2[i]=t+'A'-10;num/=d2;if (num==0) break;i++;}for (j=0;j<i/2;j++){c=s2[j];s2[j]=s[i-j];s2[i-j]=c;}s2[i+1]='\0';}7.最大公约数、最小公倍数语法:resulet=hcf(int a,int b)、result=lcd(int a,int b)参数:a:int a,求最大公约数或最小公倍数b:int b,求最大公约数或最小公倍数返回值:返回最大公约数(hcf)或最小公倍数(lcd)注意:lcd 需要连同hcf 使用源程序:int hcf(int a,int b){int r=0;while(b!=0){r=a%b;a=b;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDb=r;}return(a);我也可以做到..10 / 78}lcd(int u,int v,int h){return(u*v/h);}8.组合序列语法:m_of_n(int m, int n1, int m1, int* a, int head)参数:m:组合数C 的上参数n1:组合数C 的下参数m1:组合数C 的上参数,递归之用*a:1~n 的整数序列数组head:头指针返回值:null注意:*a 需要自行产生初始调用时,m=m1、head=0调用例子:求C(m,n)序列:m_of_n(m,n,m,a,0);源程序:void m_of_n(int m, int n1, int m1, int* a, int head){int i,t;if(m1<0 || m1>n1) return;if(m1==n1){return;}m_of_n(m,n1-1,m1,a,head); // 递归调用t=a[head];a[head]=a[n1-1+head];a[n1-1+head]=t;m_of_n(m,n1-1,m1-1,a,head+1); // 再次递归调用t=a[head];a[head]=a[n1-1+head];a[n1-1+head]=t;}9.快速傅立叶变换(FFT)语法:kkfft(double pr[],double pi[],int n,int k,double fr[],double fi[],intl,int il);参数:我也可以做到..11 / 78pr[n]:输入的实部pi[n]:数入的虚部n,k:满足n=2^kfr[n]:输出的实部fi[n]:输出的虚部l:逻辑开关,0 FFT,1 ifFTil:逻辑开关,0 输出按实部/虚部;1 输出按模/幅角返回值:null注意:需要math.h源程序:void kkfft(pr,pi,n,k,fr,fi,l,il)int n,k,l,il;double pr[],pi[],fr[],fi[];{int it,m,is,i,j,nv,l0; double p,q,s,vr,vi,poddr,poddi;for (it=0; it<=n-1; it++){m=it; is=0;for (i=0; i<=k-1; i++){j=m/2; is=2*is+(m-2*j); m=j;}fr[it]=pr[is]; fi[it]=pi[is];}pr[0]=1.0; pi[0]=0.0;p=6.283185306/(1.0*n);pr[1]=cos(p); pi[1]=-sin(p);if (l!=0) pi[1]=-pi[1];for (i=2; i<=n-1; i++){p=pr[i-1]*pr[1];q=pi[i-1]*pi[1];s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);pr[i]=p-q; pi[i]=s-p-q;}for (it=0; it<=n-2; it=it+2){vr=fr[it]; vi=fi[it];fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1]; }m=n/2; nv=2;for (l0=k-2; l0>=0; l0--){我也可以做到..12 / 78m=m/2; nv=2*nv;for (it=0; it<=(m-1)*nv; it=it+nv)for (j=0; j<=(nv/2)-1; j++){p=pr[m*j]*fr[it+j+nv/2];q=pi[m*j]*fi[it+j+nv/2];s=pr[m*j]+pi[m*j];s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]); poddr=p-q; poddi=s-p-q;fr[it+j+nv/2]=fr[it+j]-poddr;fi[it+j+nv/2]=fi[it+j]-poddi;fr[it+j]=fr[it+j]+poddr;fi[it+j]=fi[it+j]+poddi;}}if (l!=0)for (i=0; i<=n-1; i++){fr[i]=fr[i]/(1.0*n);fi[i]=fi[i]/(1.0*n);}if (il!=0)for (i=0; i<=n-1; i++){pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);if (fabs(fr[i])<0.000001*fabs(fi[i])) {if ((fi[i]*fr[i])>0) pi[i]=90.0;else pi[i]=-90.0;}DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDelsepi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;}return;}10.Ronberg 算法计算积分语法:result=integral(double a,double b);参数:a:积分上限b:积分下限我也可以做到..13 / 78function f:积分函数返回值:f 在(a,b)之间的积分值注意:function f(x)需要自行修改,程序中用的是sina(x)/x 需要math.h默认精度要求是1e-5源程序:double f(double x){return sin(x)/x; //在这里插入被积函数}double integral(double a,double b){double h=b-a;double t1=(1+f(b))*h/2.0;int k=1;double r1,r2,s1,s2,c1,c2,t2;loop:double s=0.0;double x=a+h/2.0;while(x<b){s+=f(x);x+=h;}t2=(t1+h*s)/2.0;s2=t2+(t2-t1)/3.0;if(k==1){k++;h/=2.0;t1=t2;s1=s2;goto loop;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}r2=c2+(c2-c1)/63.0;if(k==3){r1=r2; c1=c2;k++;h/=2.0;t1=t2;s1=s2;我也可以做到..14 / 78goto loop;}while(fabs(1-r1/r2)>1e-5){ r1=r2;c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}return r2;}11.行列式计算语法:result=js(int s[][],int n)参数:s[][]:行列式存储数组n:行列式维数,递归用返回值:行列式值注意:函数中常数N 为行列式维度,需自行定义源程序:int js(s,n)int s[][N],n;{int z,j,k,r,total=0;int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/if(n>2){for(z=0;z<n;z++){for(j=0;j<n-1;j++)for(k=0;k<n-1;k++)if(k>=z) b[j][k]=s[j+1][k+1]; elseb[j][k]=s[j+1][k];if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/else r=(-1)*s[0][z]*js(b,n-1);total=total+r;}}else if(n==2)total=s[0][0]*s[1][1]-s[0][1]*s[1][0];return total;我也可以做到..15 / 78}12.求排列组合数语法:result=P(long n,long m); / result=long C(long n,long m);参数:m:排列组合的上系数n:排列组合的下系数返回值:排列组合数注意:符合数学规则:m<=n源程序:long P(long n,long m){long p=1;while(m!=0){p*=n;n--;m--;}return p;}long C(long n,long m){long i,c=1;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDi=m;while(i!=0){c*=n;n--;i--;}while(m!=0){c/=m;m--;}return c;}13.求某一天星期几语法:result=weekday(int N,int M,int d)参数:N,M,d:年月日,例如:2003,11,4返回值:0:星期天,1 星期一……注意:需要math.h适用于1582 年10 月15 日之后, 因为罗马教皇格里高利十三世在这一天启用新历法.源程序:我也可以做到..16 / 78int weekday(int N,int M,int d){int m,n,c,y,w;m=(M-2)%12;if (M>=3) n=N;else n=N-1;c=n/100;y=n%100;w=(int)(d+floor(13*m/5)+y+floor(y/4)+floor(c/4)-2*c)%7;while(w<0) w+=7;return w;}14.卡特兰(Catalan) 数列原理令h(1)=1,catalan 数满足递归式:h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2)该递推关系的解为:h(n)=c(2n-2,n-1)/n (n=1,2,3,...)1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440,9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420,24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …1.括号化问题。

信息学奥赛STL数据类型简介(30张PPT)

信息学奥赛STL数据类型简介(30张PPT)


return 0;
•}
四、其他函数库
• 删除函数erase(); 根据元素的值删除元素不能根据第几个元素进行删除 • 插入元素:insert(); • clear()--清除所有元素 • count()--返回某个值元素的个数 • empty()--如果集合为空,返回true • equal_range()--返回集合中与给定值相等的上下限的两个迭代器 • find()--返回一个指向被查找到元素的迭代器 • get_allocator()--返回集合的分配器 • lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器 • key_comp()--返回一个用于元素间值比较的函数 • max_size()--返回集合能容纳的元素的最大限值 • rbegin()--返回指向集合中最后一个元素的反向迭代器 • rend()--返回指向集合中第一个元素的反向迭代器 • size()--集合中元素的数目 • swap()--交换两个集合变量 • upper_bound()--返回大于某个值元素的迭代器 • value_comp()--返回一个用于比较元素间的值的函数
不定数组(vector)
单县第一中学2017级 信息学奥林匹克竞赛知识选讲
一、定义
• Vector是一个不定数组,其大小可根据需要随时 变动,可定义为一维数组,或者二维数组,甚至 多维。
• 数据库为#include<vector> • 定义如下:
– 1一维:vector<int> vec;//定义了一个名为vec 的一维数组
代码展示(缺少头文件)
• map<long,int> m;//咱们的map桶
• int n;

ACM常用C++函数和stl总结全

ACM常用C++函数和stl总结全

ACM 常⽤C++函数和stl 总结⽂章⽬录⼀、前⾔本博客对ACM的常⽤的函数和c++STL做⼀个简单的总结,显然善⽤这些函数,可以对代码做⼤幅度地简化本⽂主要对每个头⽂件/函数分常⽤和不常⽤做总结注意:本博客只是针对编程竞赛中⽐较常⽤的⽤法,只是浅谈(因为⽤来打⽐赛够了),想要深⼊同学可以移步直接看c++官⽅提供的详细⽤法⽤法:⾃⼰根据⽬录导航到⾃⼰想看的地⽅⼆、⼀些⾮STL 的常⽤函数1. cstdio 头⽂件1.1 scanf 函数(常⽤)⼀个输⼊函数基本形式为(以输⼊整数int型为例),⼀般传⼊两个参数,第⼀个是格式化字符串,第⼆个是变量引⽤其中需要注意的是,逗号后⾯的必须传⼊的是需要输⼊的变量的地址,固⼀般在变量名前加⼀个&(取地址符)由于需要传⼊的是地址,固我们在输⼊数组时也可以这样做当然,还有⼀个特别需要注意的就是输⼊字符串⼀些⼩技巧int a, b, c;scanf("%d", &a);//输⼊⼀个scanf("%d%d%d", &a, &b, &c);//输⼊多个123int arr[10010];for (int i = 0; i < 10000; ++i) scanf("%d", &arr[i]);//常规输⼊for (int i = 0; i < 10000; ++i) scanf("%d", arr + i);//和上⾯的是同理的123char str[110];scanf("%s", str);//下标从0开始的字符串scanf("%s", &str[1]);//下标从1开始的字符串123刷题的时候可能有些新⼿对下⾯类似这种输⼊很头痛3a 7b 8k 100常规的做法就是开⼀个char数组,将字符当初字符串输⼊这种做法,在某些情况下可能还需要⼀个getchar()函数进⾏辅助(例如吃掉换⾏符),但下⾯这种做法,可以发挥出强⼤的scanf 的优势。

STL应用篇

STL应用篇

引子STL 主要是为我们提供了丰富的容器和算法,以至于我们在设计程序的时候只用考虑一些更为复杂的结构,比如树状结构,除此之外就是设计的问题。

另外,STL作为一个开放的源码库,良好的泛型结构设计,高效的算法实现都为开发者提供了很好的参考。

但是,正因为STL的灵活性,以及高效性,使得对STL的使用和了解也不算是很容易,我在平时的工作中也深有体会,因此希望能够系统总结一下STL的基本使用方法,以及分析其部分实现,借以提高程序设计能力。

1.什么是STL?1)STL是一套很好的框架,最核心的部件包括:容器,迭代器和算法2)容器包括两大类:a) 序列型:vector, deque, list; b) 关联型:set, multiset, map, multimap3) 迭代器是一个“可遍历STL容器内全部或部分元素的”对象。

按照功能不同可分为五类:input, output, forward, 双向迭代器,随机迭代器。

作用:提供遍历该聚合类型的接口,而不暴露该类型的实现。

2.STL中的容器2.1什么时候使用vectorVector 的特点:1)支持运行时加入新的元素,但是在任意位置插入元素效率较低,因为vector的元素是存放在一段连续的内存中,以提高随机访问的效率。

但如果你需要大量在任意位置插入元素,则最好用List, 因为List采用的链表来管理内部元素。

2)不提供巨大的操作集,如sort(), find(), max(), min(); 而将这些通用的操作交给泛型算法提供。

Vector 中如何存储类类型?2.2 map<string, string>是什么意思?当String作为Key时,map内部是如何计算Key的值的呢?3.STL中的String类4.STL中的迭代器为什么要使用迭代器?在STL中,迭代器属于某一个容器类,比如vector<string>::Iterator iter=vect.begin() 迭代器(Iterator)的实现5.STL中的算法搜索(search):排序(sorting):删除(deletion):算术(numberic):关系(relational):生成(generation):STL应用篇概要STL是泛型编程(Generic Programming,GP)和C++结合的产物。

STL各种函数详细讲解

STL各种函数详细讲解

STL各种函数详细讲解| 全排列函数next_permutationSTL 中专门用于排列的函数(可以处理存在重复数据集的排列问题)头文件:#includeusing namespace std;调用:next_permutation(start, end);注意:函数要求输入的是一个升序排列的序列的头指针和尾指针.用法:// 数组int a[N];sort(a, a+N);next_permutation(a, a+N);// 向量vector ivec;sort(ivec.begin(), ivec.end());next_permutation(ivec.begin(), ivec.end());例子:vector myVec;// 初始化代码sort(myVec.begin(),myVec.end());do{for (i = 0 ;i < size;i ++ ) cout << myVec[i] << " /t " ;cout << endl;}while (next_permutation(myVec.begin(), myVec.end()));ACM/ICPC 竞赛之STL 简介一、关于STLSTL(Standard Template Library,标准模板库)是C++语言标准中的重要组成部分。

STL 以模板类和模板函数的形式为程序员提供了各种数据结构和算法的精巧实现,程序员如果能够充分地利用STL,可以在代码空间、执行时间和编码效率上获得极大的好处。

STL 大致可以分为三大类:算法(algorithm)、容器(container)、迭代器(iterator)。

STL 容器是一些模板类,提供了多种组织数据的常用方法,例如vector(向量,类似于数组)、list(列表,类似于链表)、deque(双向队列)、set(集合)、map(映象)、stack(栈)、queue(队列)、priority_queue(优先队列)等,通过模板的参数我们可以指定容器中的元素类型。

ACM算法题以及答案

ACM算法题以及答案

ACM算法题使用C++实现在做这些题目之前必须了解vector(数组),list(链表)、deque(双端队列)、queue(队列), priority_queue(优先队列)Stack(栈)、set(集合)、map(键值对),mutilset、mutilmap。

stack堆栈,没有迭代器,支持push()方法。

后进先出,top()返回最顶端的元素,pop()剔除最顶元素deque双端队列,支持迭代器,有push_back()方法,跟vector差不多,比vector多了个pop_front,push_front方法queue队列,先进先出,不支持迭代器,有push()方法,pop()剔除第一个元素,front()返回第一个元素vector使用vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。

vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:using std::vector; vector<int> v;或者连在一起,使用全名:std::vector<int> v;建议使用全局的命名域方式:using namespace std;1.vector的声明vector<ElemType> c; 创建一个空的vectorvector<ElemType> c1(c2); 创建一个vector c1,并用c2去初始化c1vector<ElemType> c(n) ; 创建一个含有n个ElemType类型数据的vector;vector<ElemType> c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;c.~vector<ElemType>(); 销毁所有数据,释放资源;2.vector容器中常用的函数。

ACM 程序设计竞赛入门:第2讲 STL编程

ACM 程序设计竞赛入门:第2讲 STL编程
vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; vector<int>::iterator it; for(it=v.begin();it!=v.end();it++) {
cout<<*it<<" "; } cout<<endl; return 0; }
元素插入
2.1尾部元素扩张
#include<vector> using namespace std;
int main() {
vector<int> v; v.push_back(2); v.push_back(7); v.push_back(9);
return 0; }
2.2下标方式访问元素
#include<iostream> #include<vector> using namespace std;
多重映射(multimap)允许键对有相等的次序的映射
<map>
1. STL简介
1.1 关于STL
STL算法
是一些模板函数 提供了相当多的有用算法和操作
STL迭代器
是对C中的指针的一般化,用来将算法和容器联 系起来。
几乎所有的STL算法都是通过迭代器来存取元素 序列进行工作的,而STL中的每一个容器也都定
vector<int>::iterator it; for(it=v.begin();it!=v.end();it++) {
cout<<*it<<" "; } cout<<endl; return 0; }

【信息学竞赛精品】stl 的妙用

【信息学竞赛精品】stl 的妙用

Stl类型
• 容器(containers) • 迭代器(iterators) • 空间配置器(allocator) • 配接器(adapters) • 算法(algorithms) • 仿函数(functors)
Stl容器(containers)
1.序列式容器 • 向量(vector) 连续存储的元素<vector> • 列表(list) 由节点组成的双向链表,每个结点包含着一个元素<list> • 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque> 2.适配器容器 • 栈(stack) 后进先出的值的排列 <stack> • 队列(queue) 先进先出的值的排列 <queue> • 优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列
Stl
STL (模板库)
STL是Standard Template Library的简称,中文名标准模板库,惠普实 验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和 David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是 一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算 法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上 很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新 开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额 外的库文件。
Stl/容器(containers)/向量(vector)
用法 3. vector基本操作 (2). 修改 多个元素赋值: vec.assign(); //类似于初始化时用数组进行赋值 末尾添加元素: vec.push_back(); 末尾删除元素: vec.pop_back(); 任意位置插入元素: vec.insert(); 任意位置删除元素: vec.erase(); 交换两个向量的元素: vec.swap(); 清空向量元素: vec.clear();

ACM STL库课件

ACM STL库课件
结果输出: 32 32
sort 的使用
对数组使用sort排序,输入8 5 1 6 9
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main(){ int a[5]; for(int i=0; i<5; i++) scanf("%d",&a[i]); sort(a,a+5); for(int i=0; i<5; i++) printf("%d ",a[i]); system("pause"); }
结果输出: 15689
sort 的使用
二级排序,坐标排序,输入(2,3)(4,2)(1,7)(2,4) 优先按x小的排序,x一样按y小的排序
struct node{ int x,y; }p[4]; bool cmp(node a,node b){
if(a.x==b.x) return
a.y<b.y; return a.x<b.x; }
结果输出: 01234 0134
map 的使用
对杂乱无序的字符串或数字做哈希匹配,可以 重新编号,输入一些英文名字,给他们编号
#include<iostream> #include<cstdio> #include<string> #include<map> using namespace std; int main(){ map<string,int> mp; mp.clear(); //清空 string nm[]={"abc","david","lucy","abc","app","lucy"}; int index=1; for(int i=0; i<6; i++) { if(mp[nm[i]]==0) mp[nm[i]]=index++; //判断是否已经出现过,没出现过,就编号 }

ACM简单题秒杀和C++STL

ACM简单题秒杀和C++STL

Step 1: 学好数据结构
• 常用数据结构
• • • • • • • 链表 堆栈/队列 优先队列 树 图 Hash 并查集
Step 2: 学习常见算法
• 常用的题型(ZOJ论坛有题目分类信息)
• • • • • • • 简单题 模拟题 搜索题 贪心题 动态规划(DP)题 图论题 数学题
Step 3: 日常学习
Part I ACM竞赛简单题秒杀攻略
简单题
• 简单题的特点:
• 没有算法或者只有基本的算法 • 编程复杂度不高
• 分辨简单题:
• 简单题一般题目较短 • 校赛的第一题往往是简单题 • 观察rank list和场上气球情况
简单题是校赛决胜的关键
年份 总题数 简单题数量 AC所有简单题可获奖项 2005 2006 2007 2008 2009 8 8 8 9 9 4 4 4 4 4 二等奖 三等奖 二等奖 三等奖 三等奖
vector
• vector的遍历
• for (vector<int>::iterator vi = arr.begin(); vi != arr.end(); ++vi) { cout << *vi << endl; • } • 或者
• for (int i = 0; i < v.size(); ++i) { cout << v[i] << endl; • }
• 构造测试数据
• 题目提供的测试数据一般较弱 • 边界数据、特殊数据
Step 5: 复杂度估计
• 估计程序空间复杂度
• 默认空间限制:32M • char c[1000000]; // 1M • int a[1000][1000]; // 4M

stl模型案例

stl模型案例

stl模型案例
STL模型案例如下:
STL模型在许多领域都有应用,包括教育、组织管理、社会服务等。

下面是一个STL模型在学校演讲比赛中的案例。

某市举行一场演讲比赛,共有24个人参加,按参加顺序设置参赛号。

比赛共三轮,前两轮为淘汰赛,第三轮为决赛。

第一轮比赛分为4个小组,每组6个人,根据参赛号顺序依次划分。

比如为一组,为第二组,依次类推。

每个人按参赛号顺序演讲,演讲完后淘汰组内排名最后的三个选手。

第二轮比赛分为2个小组,每组6人。

每个人按参赛号顺序演讲,当小组演讲完后,淘汰组内排名最后的三个选手。

第三轮只剩下6个人,本轮为决赛,选出前三名。

选手每次要随机分组,进行比赛。

比赛评分:10个评委打分,去除最低、最高分,求平均分。

每个选手演讲完由10个评委分别打分。

该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。

通过以上案例可以看出,STL模型是一种基于步骤的思维方式,通过逐步细化每个步骤,可以帮助我们更好地理解和解决问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 标准模板库 (Standard Template Library) 就是一些常用数据结 构和算法的模板的集合。主要由 Alex Stepanov 开发,于1998 年被添加进C++标准
• 有了STL,不必再从头写大多的标准数据结构和算法,并 且可获得非常高的性能。
迭代器(iterator)
• 可遍历STL容器内全部或部分元素的对象 • 指出容器中的一个特定位置 • 所有容器都提供获得迭代器的函数
• 注意:Map和set内部的元素不可以重复 • Map中的元素是自动按key升序排序,所以不能对map用sort函数 • 但可以用迭代器按序遍历(与set类似)
Map(映射)
• 例题4:UVA 156 Ananagrams • 题目:把每个单词全部转化成小写字母,对每个单词,看它的字母 重排后得到的单词在所有输入的单词中是否出现过,若没有出现, 就输出原单词。所有要输出的单词按字典序排列输出。 • 思路:构造小写化函数,set可以解决去重和排序问题,用map建 立string与int的映射 • void string stand_words(string s1); • 注意要存储原单词! ps:也可以用multimap建立string与string的多重映射,即原单词 与现单词的映射,方便提取原单词操作
常见的STL容器及其函数
准容器类 顺序性容器 vector deque list 关联容器 set multiset map multimap 容器适配器 stack queue priority_queue 说明
从后面快速的插入与删除,直接访问任何元素 从前面或后面快速的插入与删除,直接访问任何元素 双链表,从任何地方快速插入与删除 快速查找,不允许重复值 快速查找,允许重复值 一对多映射,基于关键字快速查找,不允许重复值 一对多映射,基于关键字快速查找,允许重复值 后进先出 先进先出 最高优先级元素总是第一个出列
Queue(队列)
• • • • • • • • • • • •
队列的容器。 用法 和vector一样。 queue<int> qu; queue<POINT> qu; 我一般都用它在BFS的时候存点。 常用操作 qu.push(const value_type &val); 元素入队 qu.pop()元素出队 qu.front() 获得队首元素 qu.empty() 判断qu是否为空,是的话返回true qu.size() 获得qu的大小。
常见的STL容器
• STL容器类别
• 序列式容器-排列次序取决于插入时机和位置 • 关联式容器-排列顺序取决于特定准则
vector deque
set
list
map 序列式容器 关联式容器
序列式容器
• 序列式容器 常
见 的 • 向量(vector) 容 器 STL
顺序容器包含Vector,deque和list三种容器,其中vector和deque属于 直接访问容器,list属于顺序访问容器。
ቤተ መጻሕፍቲ ባይዱ
Sort
• 例题1:UVA 10474 Where is the Marble
• 题目:题目意思就是给出两个数m和n下面输入m个数,再依次输入n个数, 查找n个数在前面的m个数中是第几大 • 思路很简单,排序加查找(也可以二分优化)。
• 这里简述sort函数的用法
• • • • • 头文件: <algorithm> 格式: sort(vect.begin(), vect.end()); sort(vect.begin(), vect.end(), less<int>() ); 第三个参数可以自定义,主要用于自定义类型的排序
操作 begin() end() 效果 返回一个迭代器,指向第一个元素 返回一个迭代器,指向最后一个元素之后
begin()
end()
半开区间[beg, end)的好处: 1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end(),循环就可 以继续) 2.不必对空区间采取特殊处理(空区间的begin()就等于end())
STL 在ACM竞赛中的应用
ACM Matrix_68
目录
1
2 3
泛型程序设计简介与迭代器的介绍
常见的STL容器及其成员函数
相关例题解析
泛型程序设计
• 泛型程序设计,简单地说就是使用模板的程序设计法。 • 将一些常用的数据结构(比如链表,数组,二叉树)和 算法(比如排序,查找)写成模板,以后则不论数据结 构里放的是什么对象,算法针对什么样的对象,则都不 必重新实现数据结构,重新编写算法。
operator=
operator< operator<= operator> operator>= operator== operator!=
将一个容器赋给另一个容器
如果第一个容器小于第二个容器,返回true,否则返回false, 如果第一个容器小于或等于第二个容器,返回true,否则返回false 如果第一个容器大于第二个容器,返回true,否则返回false 如果第一个容器大于或等于第二个容器,返回true,否则返回false 如果第一个容器等于第二个容器,返回true,否则返回false 如果第一个容器不等于第二个容器,返回true,否则返回false
向量相当于一个动态数组,其可以动态存储元素,并提供对容器元素的随 机访问。为了提高效率,vector并不是随着每一个元素的插入而增长自己, 而是当vector要增长自己的时候,他分配的空间比当前所需的空间要多一 些。这多一些的内存空间使需要添加新元素的时候不必再重新分配内存。 与C++的内置数组相比较,除了动态之外,向量容器支持向对象。
• map中查找数据: • 第一种:用count 函数来判定关键字是否出现,其缺点是无法定位数据出现位置,
• 由于map 的特性,一对一的映射关系,就决定了count 函数的返回值只有两个,
• 要么是0,要么是1,出现的情况,当然是返回1 了 • 第二种:用find 函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回 数据所在位置的迭代器,如果map 中没有要查找的数据,它返回的迭代器等于end 函数返 回的迭代器

• };
int x, y;
• set<POINT> se;
• 基本操作对集合a中元素的有
• 插入元素:a.insert(1); • 删除元素(如果存在):a.erase(1); • 判断元素是否属于集合:if (a.find(1) != a.end()) ... • 返回集合元素的个数:a.size() • 将集合清为空集:a.clear()
priority_queue(优先队列):默认从大到小排列。
• priority_queue<int> pqu; • 如果要装结构体的话,要重载结构体的小于号,或者自己写一个cmp函数。 • struct cmp • { operator bool ()(int x, int y) { return x > y; // x小的优先级高 } • }; • priority_queue<int, vector<int>, cmp>q;//第二个参数为容器类型。第三个参数为比较函数。
Queue(队列)
• 例题5:UVA 540 Ananagrams • 题目:题意:有t个团队的人在排队。每次来了一个新人之后,如 果他有队友在排队,那么这个新人会插队到队友的身后。要求支持 三种指令:ENQUEUE x; DEQUEUE(队首出队); STOP。模拟 这个过程,输出出队顺序 • 思路:模拟题。每个队列在一个大队列排队 • queue<int> q, q2[maxt]; • q为总的团队队列,q2为每个团队的队列
Set(集合)
• 例题3:UVA 10815 Andy's First Dictionary • 题目:给出一串单词,把所有单词改小写去重按字典序输出。 • 思路:set可以解决去重和排序问题。 • set中每个元素最多只出现一次 • set中的元素已经从小到大排序好 • 如何通过迭代器从小到大遍历所有元素 • for (set<string>::iterator i = d.begin(); i != d.end(); i++)
9
Vector(不定长数组)
用法: vector<类型> 名字; 例如 vector<int> ve; vector<string> ve; 自己定义的结构体什么的也可以往里塞 struct POINT { int x, y; }; vector<POINT> ve; 基本操作 ve.push_back(const value_type &val); 作用是在数组后面增加一个元素。括号里填的是ve里装的东西 ve.clear();清空ve里的所有元素。 ve.empty();判断ve是否为空,如果是返回true,否则false ve.size();返回ve的长度。注意这里返回的类型是unsigned int,如果ve是空的ve.size() - 1 就会爆掉。使用的时候一定要小心(做TC的时候被坑了一次) • ve.pop_back() 删除数组里的最后一个元素。 • • • • • • • • • • • • • • •
• cout << *i << endl;
Map(映射)
• map添加数据; • map<int ,string> maplive; //第一个是键值,第二个是值 • 1.maplive.insert(pair<int,string>(102,"aclive"));
相关文档
最新文档