ACM模板之STL_容器

1.vector 向量

vector也叫可变数组,动态申请数组空间(空间为倍增)。vector重载了‘[]’下标运算符,可像操作书作一样操作vector,下标从0开始。常用的构造方法有vector<T> v(n);申请容量为n用于存放类型为T的容器。   vector<int> (n, 1);申请容量为n初始值为1的容器。

常用函数作用
int size();返回容器元素个数
bool empty();返回容器是否为空(容器为空返回真)
void clear();清空当前容器
T front();返回vector第一个元素值(下标为0)
T back();返回vector最末一个元素值
iterator begin();返回第一个元素的迭代器
iterator end();返回最后一个元素的下一位置的迭代器
void push_back(T value);在vector尾部压入一个元素value
void pop_back();弹出末尾元素

2.queue 队列

	queue队列,实现一种先进先出(FIFO)的数据结构。
常用函数作用
size()返回队列中元素个数
empty()返回队列是否为空,空为真
front()返回队首元素
push()向队列中压入一个元素(队尾)
pop()弹出队首元素

3.stack 栈

stack栈, 实现一种先进后出(FILO)的数据结构。
常用函数作用
size()返回栈内元素个数
empty()返回栈是否为空,空为真
top()返回栈顶元素
push()向栈内压入元素(栈顶)
pop()弹出栈顶元素
/*
题目描述:
现在,有一行括号序列,请你检查这行括号是否配对。
输入描述:
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),
测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
输出描述:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入:
3
[(])
(])
([[]()])
样例输出:
No
No
Yes
*/
#include <iostream>
#include <stack>
#include <string>
using namespace std;
//输入
int N;
string str;

int main()
{
	cin >> N;
	while(N--) {
		cin >> str;
		int len = str.length(); 
		stack<char> st;		//存放单个括号 
		for(int i = 0; i < len; i++) {
			if(st.empty() || str[i] == '[' || str[i] == '(') {		//如果是左半括号,直接压入 
				st.push(str[i]);
			}else if(str[i] == ']' || str[i] == ')') {		//如果是右半括号,看是否匹配 
				//匹配,弹出匹配的括号对(即弹出栈顶部元素且str[i]不压入栈) 
				if((str[i] == ']' && st.top() == '[') || (str[i] == ')' && st.top() == '(')) {		// 
					st.pop();
				}else { //不匹配,压入 
					st.push(str[i]);
				}
			} 
		}
		if(st.empty()) {		//栈为空,即所有括号都匹配完了 
			cout << "Yes" << endl; 
		} else {
			cout << "No" << endl;
		}
	}
	return 0;
}

4.priority_queue 优先队列

priority_queue:优先队列,数据结构为满足一定规则的二叉树(堆)。
默认为大根堆,priority_queue<T> que; (堆顶元素为最大值)
小根堆priority_qeue<T, vector<T>, greater<T> > que;(堆顶元素为最小值)。其中T表示容器存放的数据类型,vector<int> 表示容器类型,默认为vector类型(且只能为数组实现的容器),greater<T> 表示的为比较规则,greater表示小根堆,less表示大根堆。
也可通过重载运算符的方法实现自定义堆,通常采用重载'<'运算实现自定义规则的堆
常用函数作用
size()返回优先队列中元素个数
empty()判断队列是否为空,为空返回真
top()返回优先队列顶部元素(即优先级最高的元素)
push()向优先队列中压入一个元素
pop()弹出堆顶元素
/*
按照时间从小到大排序
输入案例
13:15
03:05
03:02
13:12
20:44
*/
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
//输入
typedef struct Time{
	int hour, minute;
	//重载<运算符,此处需声明为友元 
	friend bool operator < (Time t1, Time t2) {		 
		if(t1.hour == t2.hour) {		//注意此处与平时思维相反 
			return t1.minute > t2.minute;
		}		
		return t1.hour > t2.hour;
	}
}Time;
int main()
{
	Time time;
	priority_queue<Time> que;
	while(scanf("%d:%d", &time.hour, &time.minute) != EOF) {
		que.push(time);
	}
	while(!que.empty()) {
		Time temp = que.top();
		que.pop();
		cout << temp.hour << " : " << temp.minute << endl;
	}
	return 0;
}

5.set/multiset 集合/多重集合

集合(set)内无相同元素,多重集合(multiset)内可有多个相同值的元素。

常用函数作用
size()返回集合中元素个数
empty()判空(如果集合为空,返回true)
clear()清除所有元素
begin()返回指向第一个元素的迭代器
end()返回指向最后一个元素下一个位置的迭代器
insert()在集合中插入元素
erase()删除集合中元素(如果传参为元素,则删除所有该元素;如果传参为迭代器,则删除该位置元素)
find()返回指向被查到元素的迭代器(如果未找到,返回end())
count()返回某个元素值的个数(一般在多重集合中使用)
/*
重载运算符实现自定义排序set 
13:15
03:05
03:02
13:12
20:44
*/
#include <iostream>
#include <set>
using namespace std;
//输入
typedef struct Time{
	int hour, minute;
	friend bool operator < (Time t1, Time t2) {
		if(t1.hour == t2.hour) {
			return t1.minute < t2.minute;
		}
		return t1.hour < t2.hour;
	}
}Time;
int main()
{
	set<Time> st;	
	//插入元素值 
	st.insert({13, 15});
	st.insert({03, 05});
	st.insert({03, 02});
	st.insert({13, 12});
	st.insert({20, 44});
	set<Time>::iterator it;
	//通过迭代器 
	for(it = st.begin(); it != st.end(); it++) {	
		cout << (*it).hour << " " << (*it).minute << endl;
	} 
	return 0;
}

6.map/multimap 映射/多重映射

在次之前先接受pair对象
pair<type1, type2> p表示一个二元组(一对元素)
p.first(); 返回第一个元素
p.second(); 返回第二个元素
make_pair(value1, value2);创造一个二元组

常用函数作用
size()返回集合中元素个数
empty()判空(如果集合为空,返回true)
clear()清除所有元素
begin()返回指向第一个元素的迭代器
end()返回指向最后一个元素下一个位置的迭代器
insert()插入一个pair类型的元素(一般可用mp.insert(make_pair(value1, value2)) 插入一组元素)
erase()删除一组元素(1.输入的参数是一个pair类型的元素对 2.输入的参数是一个迭代器)
find()查找一个元素
[]映射重载了下标运算符(多重映射不可用)

举例:

#include <iostream>
#include <map>
using namespace std;
int main() {
	map<int, string> mp;
	mp[1] = "one";
	mp[3] = "three";
	mp.insert(make_pair(2, "two"));
	map<int, string>::iterator it;
	for(it = mp.begin(); it != mp.end(); it++) {
		//通过迭代器直接输出 
		cout << it->first << " " << it->second << endl;
	}
	cout << "******" << endl;
	pair<int, string> p;
	for(it = mp.begin(); it != mp.end(); it++) {
		//借助pair输出 
		p = *it;
		cout << p.first << " " << p.second << endl;
	}
	return 0;
}

7.bitset 位集合(压位)

bitset是存放0或者1的容器,一个元素只占用1bit。同时,bitset重载了"!=" 、"=="、"&="、"^="、"|="、"~="、"<<="、">>="操作运算符。

常用函数作用
bitset<n> bt;创建存储n位的bitset容器
bitset<n> bt(m);将m转为二进制存储到n位的bitset容器中
count()返回容器1的个数
any()判断是否有1,有则返回真
none()判断是否全为0,是则返回真
set()将所有位置全置为1
resset()将所有位置全置为0
set(k, v)将第k位置为v
flip()取反(0设为1, 1设为0)
flip(k)将第k位取反
to_string()转为字符串并返回
to_ulong()转为无符号长整型并返回
[]重载了下标运算符,可类似数组进行操作
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值