走进STL
快速排序
快速排序是一个经典算法:
#include<algorithm>//头文件 sort(A,A+n);//对一个下标从0开始存储,长度为n的数组升序排序
vector容器
vector容器。随着元素的数量而改变大小。它其实就是数组,却比数组强得多。
下面看看它的几种操作:
vector<int> V;//定义 V.push_back(x);//末尾增加一个元素x V.pop_back();//末尾删除一个元素 V.size();//返回容器中的元素个数
它同样可以使用下标访问。(从0开始)
和普通队列一样,它有这些基本操作: V.size();//返回q里元素个数 V.empty();//返回q是否为空,空则返回1,否则返回0 V.push(k);//在q的末尾插入k V.pop();//删掉q的第一个元素 ---这个操作最重要 V.top();//返回q的第一个元素
bitset
bitset用来压位,使复杂度在原来的基础上除以32
#include <bitset> bitset<N> S; //这样就可以建一个bitset了 S.set(); //全部变成1 S.reset(); //全部变成0 S.count(); // 返回1的个数 S.flip(); // 把S每一位都取反 S.flip(i); //仅把第i为取反 S.any(); //返回是否有1 S.none(); //返回是否没有1 ///表示并不知道这个看似牛逼的操作有什么用 a.to_ulong() //转成一个unsigned long long的数. //bitset支持位运算操作,非常强大. 如 a = a & b; a = a ^ b; a = a | b;
map
#include <map> map<type1, type2> a; //这样就定义了一个map. 需要注意的是,其中type1表示的是下标的类型,type2则表示的是存储数的类型. 例如map<string, int> a, map<int, int> a... 修改、使用都是类似于:a[type1] = type2 a.erase(type1) // 表示删除某个数 a.clear(); //清空 a.empty(); //判断是否为空 a.size(); //返回a的元素个数
map的用法还是很多的。
注意,一般来说,我们是定义
map <int, int> h;
如果要在某个位置赋值,可以直接调用
h[x] = y;
但注意,因为几乎所有的STL容器我们都只能用
:: iterator it;
来得到位置,所以如果我们要把对应的值求出来,则要用
it -> first 或 it -> seond
两种操作。
最后还需要知道,map的实现是类似于set的,所以他也支持log loglog的查找最小最大值。
具体来说,我们可以这样调用:
for (map<int,int> :: iterator it = h.begin(); it != h.end(); it ++) { printf("%d\n",it->first) H[it->first] = 1; }
set
#include <set> set <int> a; //这样就建好一个set了 请务必注意:set是不可以支持重复元素的,想要有重复元素,可以使用multiset multiset <int> a; //这是可以支持重复元素插入的。 a.insert(x); //表示在set里面插入一个x元素. a.erase(x); //表示把set里面所有为x的数的删掉. a.erase(a.find(x)); //这个表示只删除一个x. *a.begin() // 表示最小值 *a.end() // 表示最大值的下一个位置 *--a.end() //表示最大值 // 因为返回的都是一个迭代器,所以具体数值要在前面加一个*号。 可能有时候要多次用到某个迭代器,所以我们可以把他储存下来,用一个it来表示,其中it这样定义: multiset<int> :: iterator it; //那么像上面的最小值,就可以这样表示it = a.begin(), printf("%d\n", *it). it ++就可以表示下一个位置的元素,当然不要滥用,因为这个++是需要log的时间复杂度的。。 其中,set里面最重要的两个操作就是上面vector里面的两个操作,即lower_bound和upper_bound. it = a.lower_bound(x) //表示找到第一个大于等于x元素的迭代器 it = a.upper_bound(x) //表示找到第一个大于x元素的迭代器
ctime
时间测试+随机使用
在某些时候-随机功能可以拿来骗分使用,我们下次再提
srand(time(0)) //随机种子,没有这个东西,随机相当于没有随机. 主要想说的是这个: int st = clock(); // do sth printf("%lf\n", (double) (clock() - st) / CLOCKS_PER_SEC)
注意包含头文件
#include <stdlib.h>
#include <time.h>
希望与孩子们一起成长,见证