陪伴孩子成长学习的地方 ------ 扫码添加微信

走进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>

 

posted @ 2019-08-11 12:02  极光编程小助手  阅读(182)  评论(0编辑  收藏  举报