算法竞赛中STL的介绍与使用

1、为了更好兼容c程序,在引用头文件时应注意,事实上,stdio.h仍然存在,但 是C++中推荐的头文件是cstdio。类似地,string.h变成了cstring,math.h变成了 cmath,ctype.h变成了cctype。带.h后缀的头文件依然存在,但并不被C++所推荐使用。

2、相较于题目输入量很大的题目,c++输入流cin运行太慢,建议使用scanf

3、声明数组大小可以用const,不推荐用#define(const和define区别可查看我另一篇文章

4、字符串数组事实上,在c++中string头文件中定义了string类型,数组具有的功能它都具有,同时支持直接流式读写,同时还存在很多方便的运算符和函数,但是速度有些慢。

5、整数求和是,有不同类型的数组求和时,在c++中可用到模板

template<typename T>
T sum(T* begin, T* end) {
T *p = begin;
T ans = 0;
for(T *p = begin; p != end; p++)
ans = ans + *p;
return ans;
}

因为模板中只定义了ans=ans+*p而不是+=,因为没有被定义在结构体中。

STL初步:

1、排序与检索:

algorithm头文件中的:(1)sort可进行排序,sort(a,a+n)a为数组首地址,sort(a.begin(),a.end())用于vector数组。

(2)lower_bound查找“大于或者等于x的第一个数的为止”

不定长数组:vector

a.size()读取它的大小,a.resize()改变大小,a.push_back()向尾部添加元素,a.pop_back()删除尾部元素,vector是一个模板类,所以需要用vectora或者vectorb这样的方式来声明一 个vector。Vector是一个类似于inta[]的整数数组,而vector就是一个类似于 stringa[ ]的字符串数组。vector看上去像是“一等公民”,因为它们可以直接赋值,还可以作为 函数的参数或者返回值,而无须像传递数组那样另外用一个变量指定元素个数。

vector头文件中的vector是一个不定长数组,可以用clear( )清空,resize( ) 改变大小,用push_back( )和pop_back( )在尾部添加和删除元素,用empty( )测试是否为 空。vector之间可以直接赋值或者作为函数的返回值,像是“一等公民”一样。

集合:set

集合与映射也是两个常用的容器。set就是数学上的集合——每个元素最多只出现一次。 和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符。

#include<set>

#include<string>

set<string>dict;//set中元素已从小到大排好序,只需for循环即可打印从小到大元素

for(set<string>::iterator it = dict.begin(); it != dict.end(); ++it)
cout << *it << "\n";/*代码里的set<string>::iterator是什么?dict.begin( )和dict.end( )又是什么?iterator的意思
是迭代器,是STL中的重要概念,类似于指针。和“vector类似于数组”一样,这里的“类似”指
的是用法类似。*/

映射:map

map就是从键(key)到值(value)的映射。因为重载了[ ]运算符,map像是数组的“高 级版”。例如可以用一个mapmonth_name来表示“月份名字到月份编号”的映射, 然后用month_name["July"]=7这样的方式来赋值。

#include<map>

map<string,int>cnt;

栈、队列与优先队列:

栈:符合“后进先出”规则的数据结构,有push和pop两种操作,top()取栈顶元素但不删除

#include<stack>;stack<int>s;

队列:

队列是符合“先进先出”(First In First Out,FIFO)原则的“公平队列”

STL队列定义在头文件中,可以用“queues”方式声明一个队列,STL的queue头文件提供了队列,用“queues”方式定义,用push( )和 pop( )进行元素的入队和出队操作,front( )取队首元素(但不删除)

优先队列:()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值