1.9位运算与常用库函数

1.位运算

& 与 AND

| 或 OR

~ 非 NOT

^ 异或 XOR

>> 右移

<< 左移

 

 

求x的第k位数字  x >> k & 1 , 从后往前数,最末一位是0

 

lowbit(x) = x & -x,-x是(~x+1) ; 返回x的最后一位1 , 即110110,则返回10 ; 101000,则返回1000.返回最后一个1加上后面的一串0.

 

2.常用库函数   #include <algorithm>

1)reverse() ; 不仅可以翻转vector , 还可以翻转数组

 

 

 将a数组和b vector翻转输出

2)unique函数 , 去重

返回去重之后的尾迭代器(或指针),仍然为前闭后开,即这个迭代器是去重之后末尾元素的下一个位置。该函数常用于离散化,利用迭代器(或指针)的减法,可计算出去重后的元素个数。

把一个vector去重:

int m = unique(a.begin(), a.end()) – a.begin();

把一个数组去重,元素存放在下标1~n:

int m = unique(a + 1, a + 1 + n) – (a + 1);

 

 

 3)random_shuffle 随机打乱 , 用法与reverse相同

random_shuffle(a,a+10);//数组
random_shuffle(b.begin() , b.end());//vector

4)sort函数,用来排序

sort(a,a+10);//数组,从小到大
sort(b.begin() , b.end() , greater<int>());//vector,从大到小

自定义struct结构体排序:

 

 

5)lower_bound/upper_bound  二分

lower_bound 的第三个参数传入一个元素x,在两个迭代器(指针)指定的部分上执行二分查找,返回指向第一个大于等于x的元素的位置的迭代器(指针)。

upper_bound 的用法和lower_bound大致相同,唯一的区别是查找第一个大于x的元素。当然,两个迭代器(指针)指定的部分应该是提前排好序的。

 

在有序int数组(元素存放在下标1~n)中查找大于等于x的最小整数的下标:

int I = lower_bound(a + 1, a + 1 + n,. x) – a;

 

在有序vector<int> 中查找小于等于x的最大整数(假设一定存在):

int y = *--upper_bound(a.begin(), a.end(), x);

 

posted @ 2021-11-11 19:36  乐池  阅读(67)  评论(0)    收藏  举报