lower_bound和upper_bound
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
在从小到大的排序数组中,
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
全排列函数
1)next_permutation:求下一个排列组合
a.函数模板:next_permutation(arr, arr+size);
b.参数说明:
arr: 数组名
size:数组元素个数
c.函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返回false,否则返回true,排列好的数在数组中存储
d.注意:在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。
比如,如果数组num初始化为2,3,1,那么输出就变为了:{2 3 1} {3 1 2} {3 2 1}
2)prev_permutation:求上一个排列组合
a.函数模板:prev_permutation(arr, arr+size);
b.参数说明:
arr: 数组名
size:数组元素个数
c.函数功能: 返回值为bool类型,当当前序列不存在上一个排列时,函数返回false,否则返回true
d.注意:在使用前需要对欲排列数组按降序排序,否则只能找出该序列之后的全排列数。
vector
1.vector 构造函数
vector v ,创建一个空的vector。
vector v1(v) ,复制一个vector。
vector v(n) ,创建一个vector,含有n个数据,数据均已缺省构造产生。
vector v(n, elem) ,创建一个含有n个elem拷贝的vector。
vector v(beg,end) ,创建一个以[beg;end)区间的vector。
v.~ vector () ,销毁所有数据,释放内存。
2.vector 中常用函数方法
v.assign(beg,end) , 将[beg; end)区间中的数据赋值给v。
v.assign(n,elem) , 将n个elem的拷贝赋值给v。
v.at(idx) , 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
v.begin() , 传回迭代器重的可一个数据。
v.capacity() , 返回容器中数据个数。
v.clear() , 移除容器中所有数据。
v.empty() , 判断容器是否为空。
v.end() , 指向迭代器中的最后一个数据地址。
v.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置(位置指传回地址值)。
v.insert(pos,n,elem) 在pos位置插入在[beg,end)区间的数据。无返回值。
v.insert(pos,beg,end) 在pos位置插入n个elem数据。无返回值。
v.erase(pos) 删除pos位置的数据,传回下一个数据的位置。
v.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
v.capacity() 返回容器中数据个数。
v.size() 返回容器中实际数据的个数。
v.reserve() 保留适当的容量。
v.resize(num) 重新指定队列的长度。
v.max_size() 返回容器中最大数据的数量。
c.rbegin() 传回一个逆向队列的第一个数据。
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.front() 传回地一个数据。
c.back() 传回最后一个数据,不检查这个数据是否存在。
c1.swap(c2) 将c1和c2元素互换。
swap(c1,c2) 同上操作。
链表
#include <cstdio>
#include <list>
using namespace std;
using Iter = list<int>::iterator;
const int maxN = 1e5 + 10;
Iter pos[maxN];
list<int> queList;
bool erased[maxN];
int N;
void buildQueue()
{
queList.push_front(1);
pos[1] = queList.begin();
for (int i = 2; i <= N; i++)
{
int k, p;
scanf("%d%d", &k, &p);
if (p == 0)
{
pos[i] = queList.insert(pos[k], i); //left
}
else
{
auto nextIter = next(pos[k]);
pos[i] = queList.insert(nextIter, i); //right
}
}
int M;
scanf("%d", &M);
for (int x, i = 1; i <= M; i++)
{
scanf("%d", &x);
if (!erased[x])
{
queList.erase(pos[x]);
}
erased[x] = true;
}
}
int main()
{
scanf("%d", &N);
buildQueue();
bool first = true;
for (int x: queList)
{
if (!first)
putchar(' ');
first = false;
printf("%d", x);
}
putchar('\n');
return 0;
}
有限队列
//升序队列
priority_queue <int,vector,greater > q;
//降序队列
priority_queue <int,vector,less >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)