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);