【暖*墟】 #STL函数库# 各种竞赛常用STL容器

什么是 STL?

STL(Standard Template Library)是 C++ 标准模板库,里面提供了大量模板。

vector (不定长数组)

加载库:include < vector > 申明:vector < type > name (从0开始)

#include<vector>
vector<int> a; //相当于不定长int数组
vector<int> b[227]; 
//相当于第一维长227,第二位不定长的int数组

struct node{...};
vector<node> c; //自定义的结构体类型也可以保存在vector中

vector中元素在内存中连续,支持随机寻址(任意询问任一元素)

但它不支持在任意位置 O(1)插入,增删操作一般在末尾进行。

v.push_back(x) 将元素 x 压入 v 末尾。v.clear() 清空 v 中所有元素。

v.begin() 指向 vector 中0号位置的元素的指针地址。

v.end() 指向 vector 中最后一个元素的下一个的指针地址。

应用:题目未知数组长度时,使用 vector 代替数组。

Q:迭代器 it ?(int类型)

A:指向内存中的地址。定义方式 vector<int> ::iterator it;

可以用它去 遍历 vector 数组 。用‘’*‘’取出指针,*it

it++;//地址向后移一位 ( it+=2 在目前的部分版本中是可以的 )

输出地址指向的数:cout << (*it) << endl;(或 *(it+2) )。

【遍历vector<int> a,并输出它的所有元素】的两种方法:

for(int i=0;i<a.size();i++) cout<<a[i]<<endl;

for(vector<int>::iterator it=a.begin();it!=a.end();it++)
    cout<<*it<<endl;

queue (先进先出)

加载库:include < queue >  申明:queue < type > name

queue中元素在内存中不一定连续。

q.push(x) 向队列 q 末尾加入元素 x 。

q.front() 返回队列 q 开头元素。q.back() 返回队列 q 末尾元素。

q.size() 返回队列 q 元素个数。q.empty() 返回队列 q 是否为空。

应用:SPFA算法,BFS。(需要先来先走的情况,扩展节点)

stack (后进先出)

加载库:include < stack > 申明:stack < type > name

stack中元素在内存中不一定连续。

t.top() 返回 t 栈顶元素。t.pop() 弹出 t 栈顶元素。

t.push(x) 将元素 x 压入 t 栈顶。

priority_queue (优先队列)

加载库:include < priority_queue >  申明:priority_queue < type > name

一般使用:priority_queue< int,vector<int>,greater<int> > q; //小根堆

( 注意有三个元素要写,vector<int>无意义,但要写;或者只写前面的一个也可以 )

重载小于号:

struct node{ //默认大根堆
    int x,y; //先按和排序,再按x排序
    bool operator<(const node &v) const {
        if(x+y!=v.x+v.y) return x+y < v.x+v.y; //按总分排序
        return x<v.x; //按x排序
    } //重载之后才变为从小到大排序
}; 

priority_queue<int> q;

优先队列就是堆,支持在队列中加入元素、取堆顶、删除堆顶。

堆中会认为“大”的更“小”,??????

q.top() 返回 q 中堆顶。q.pop() 弹出 q 中堆顶。

q.push(x) 将 x 压入 q 中。

deque(双端队列)

加载库:include < deque >  申明:deque < type > name

双端队列:支持在两端高效地插入删除元素的连续线性存储空间。

begin/end:deque的头/尾迭代器。

front/back:队头/队尾元素(迭代器指向的元素)。

push_back/push_front:从队尾/队头入队。

pop_back/pop_front:从队尾/队头出队。

clear:清空队列(O(n))。

set (去重并已经排序的集合)

加载库:include < set >  申明:set < type > name

set支持插入、删除、查找元素,并且支持查询大于(等于)某值的最小元素。

s.insert(x) 将 x 加入集合 s 中。s.begin() 返回集合 s 第一个元素的迭代器。

s.end() 返回集合最后一个元素下一个位置的迭代器。

 

//↑↑↑已去重集合

for(set<int> ::iterator it=s.begin(); it!=s.end(); it++)

cout<<(*it)<<endl;

//↓↓↓未去重集合

for(multiset<int> ::iterator it=s.begin(); it!=s.end(); it++)

cout<<(*it)<<endl;

multiset (可重集合)

加载库:include < multiset >  申明:multiset < type > name

multiset与 set 相同,但允许集合中有多个相同元素。

map (散列表&&映射关系)

加载库:include < map >  申明:map < type1,type2 > name

map是一种关联容器,提供一对一映射处理的能力。

 

map<int,int> a;

int main(){

a[2]=5; a[3]=6;

//pair<int,int> (2,5)

cout << (*a.find(2)).first << endl;

cout << (*a.find(2)).second << endl;

cout << (a.find(2)==a.end()) << endl;

//a.find(2)返回迭代器所表现的位置

}

pair (将2个数据组合成一个数据)

// 排序时,默认先比较第一关键字,再比较第二关键字。

 

typedef pair<int,int> mp;

mp b[10]={mp(2,4),mp(3,5),mp(1,5),mp(2,3)};

int main(){

sort(b,b+4);

for(int i=0;i<4;i++)

cout<<b[i].first<<" "<<b[i].second<<endl;

}

stl中复杂度的比较

auto (自动寻找元素类型)

 

auto it = v.begin(); //用auto赋初始值,自动寻找it类型

for(auto x:v) cout<<x<<endl; //按顺序从前到后输出

猜你喜欢

转载自blog.csdn.net/flora715/article/details/82182878