STL函数

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)     同上操作。

链表

P1160 队列安排

#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(),这个类就有了类似函数的行为,就是一个仿函数类了)

deque

传送门
应用 P1886 滑动窗口 /【模板】单调队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值