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() | 弹出栈顶元素 |
#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] == ')') {
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() | 弹出堆顶元素 |
#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() | 返回某个元素值的个数(一般在多重集合中使用) |
#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++) {
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() | 转为无符号长整型并返回 |
[] | 重载了下标运算符,可类似数组进行操作 |