STL和基本数据结构
STL容器
- vector
- 栈
- 队列
- 链表
- set
- map
sort函数
next_permutation函数
STL:C++标准模板库(Standard Template Library)
- 常用的数据结构、算法
- 能极大地简化编程。
容器
-
顺序式容器:vector,list,deque,queue,priority_queue,stack等
-
关联式容器:set,multiset,map,multimap等。
vector
- 数组:算法竞赛中,为避免出错,一般用静态数组,
- 能开多大就开多大:int a[1000000], dp[1000000];
- 如果空间紧张,用STL的vector建立动态数组,不易出错。
Vector:
- 动态数组,运行时根据需要改变数组大小。
- 以数组形式存储,内存空间是连续的,索引可以在常数时间内完成。
- 但是在中间进行插入和删除操作,会造成内存块的拷贝。
vector容器能存放任何类型的对象:
功能 | 例子 | 说明 |
定义int型数组 | vector<int> a; | 默认初始化,a为空 |
vector<int> b(a); | 用a定义b | |
vector<int> a(100); | a有100个值为0的元素 | |
vector<int> a(100, 6); | 100个值为6的元素 | |
定义string型数组 | vector<string> a(10,”null”); | 10个值为null的元素 |
vector<string> vec(10,”hello”); | 10个值为hello的元素 | |
vector<string>b(a.begin(), a.end()); | b是a的复制 | |
定义结构型数组 | struct point { int x, y;}; vector<point> a; | a用来存坐标 |
定义多维数组,例如定义一个二维数组: 多维数组
- vector<int> a[MAXN];
- 它的第一维大小是固定的MAXN,第二维是动态的。
- 用这个方式,可以实现图的邻接表存储。
vector各种属性
功能 | 例子 | 说明 |
赋值 | a.push_back(100); | 在尾部添加元素 |
元素个数 | int size = a.size(); | 元素个数 |
是否为空 | bool isEmpty = a.empty(); | 判断是否为空 |
打印 | cout<<a[0]<<endl; | 打印第一个元素 |
中间插入 | a.insert(a.begin()+i, k); | 在第i个元素前面插入k |
尾部插入 | a.push_back(8); | 尾部插入值为8的元素 |
尾部插入 | a.insert(a.end(), 10,5); | 尾部插入10个值为5的元素 |
删除尾部 | a.pop_back(); | 删除末尾元素 |
删除区间 | a.erase(a.begin()+i, a.begin()+j); | 删除区间[i, j-1]的元素 |
删除元素 | a.erase(a.begin()+2); | 删除第3个元素 |
调整大小 | a.resize(n) | 数组大小变为n |
清空 | a.clear(); |
|
翻转 | reverse(a.begin(), a.end()); | 用函数reverse翻转数组 |
排序 | sort(a.begin(), a.end()); | 用函数sort排序,从小到大 |
例:hdu 4841圆桌问题
- 圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。从第一个人开始数数,数到第m个人,立即赶走该人;
- 然后从被赶走的人之后开始数数,再将数到的第m个人赶走……依此方法不断赶走围坐在圆桌上的人。
- 预先应如何安排这些好人与坏人的座位,能使得在赶走n个人之后,圆桌上围坐的剩余的n个人全是好人?
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector <int> table; //模拟圆桌
int n, m;
while(cin >> n >> m)
{
table.clear();
for(int i=0; i<2*n; i++) table.push_back(i); //初始化
int pos = 0; //记录当前位置
for(int i=0; i<n; i++) //赶走n个
{
pos = (pos+m-1) % table.size(); //圆桌是个环,取余处理
table.erase(table.begin() + pos); //赶走坏人,table人数减1
}
int j = 0;
for(int i=0; i<2*n; i++) //打印预先安排座位
{
if(!(i%50) && i) cout<<endl; //50个字母一行
if(j<table.size() && i==table[j]) //table留下的都是好人
{
j++;
cout<<"G";
}
else
cout<<"B";
}
cout<<endl<<endl; //留一个空行
}
return 0;
}