C/C++语法:(六)常用库函数与位运算
1.位运算
当代计算机毕竟服务于二进制,有这么个运算方式也就不奇怪了,与、或、非(取反)就不谈了,胎教的时候已经学过了,着重看一下异或:
异或可以理解为无进制加法,如:
\[0\oplus0 = 0
\]
\[1\oplus1=0
\]
\[0\oplus1=0
\]
除此之外还有左移、右移,计算机组成原理里已经学得很多了,无需多言。
//若想取出一个数的二进制数的第k位
int a = 13;
cout << (a >> 2 & 1) << endl;
//取出若干位
for (int i = 0; i <5; i ++)
cout << (a >> i & 1) << endl;
//lowerbit 返回最后一个1以及之后的数
//如x=1001000 lowerbit(x) = 1000
//从低层实现上看 lowerbit(x) = x & (-x);
int a = 23333;
int b = -a;
int c = ~a + 1;
//根据补码知识,b和c是完全相等的
2.常用库函数
以下介绍的函数基本都在algorithm库中:
(1)reverse
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> a({1,2,3,4,5});
reverse(a.begin(), a.end()); //翻转vector
int a[] = {1,2,3,4,5};
reverse(a, a + 5); //翻转数组 注意最后要写a.size()
}
(2)unique函数
//前提条件:unique只适用于排好序的数组或其他
//unique返回的是去重之后的尾迭代器(指针)、
//例如经过unique后 a = {1,2,3,4,x,x,x};
//unique返回的迭代器指向第一个x
int a[] = {1,1,2,2,3,3,4};
int m = unique(a, a + 7) - a; //常用技巧 得到不重复元素的个数 m的值为4
vector<int> a({1,1,2,2,3,3,4});
int m = unique(a.begin(), a.end()) - a.end(); //m = 4
a.erase(unique(a.begin(), a.end()), a.end()); //得到不重复的vector 得到 1,2,3,4
(3)random_shuffle函数:用来打乱顺序 用得不多 主要用来生成数据
#include <ctime>
int main(){
vector<int> a({1,2,3,4,5}});
srand(time(0);
random_shuffle(a.begin(), a.end()); //每次运行 vector的值都不一样
}
(4)sort函数
sort(a.begin(), a.end()); //默认从小到大排序
sort(a.begin(), a.end(), greater<int>()); //从大到小排序
//自定义函数排序
bool cmp(int a, int b) //a在什么情况下应该排在b的前面
{
return a < b;
}
sort(a.begin(), a.end(), cmp);
//结构体排序
struct Rec{
int x, y;
}a[5];
bool cmp(Rec a, Rec b){
return a.x < b.x;
}
sort(a, a + 5, cmp);
如果不想定义一个比较函数,可以使用重载的方法来使结构体具有比较的能力:
struct Rec{
int x, y;
bool operator< (cosnt Rec &t) const{
return x < t.x; //从小打大的顺序
}
}a[5];
sort(a, a + 5);
(6)lower_bound与upper_bound
之前在STL里面讲过了,lower_bound是大于等于x,upper_bound是大于x,实际上它不仅仅服务于STL中的容器:
int a[] = {1,2,3,4,5,6};
int *p = lower_bound(a, a + 5, 4); //返回指向>=4元素的迭代器
//如果第三个值不在数组里 则会返回随机值
int t = lower_bound(a, a + 5, 5) - a; //返回下标 这里是4
int t = lower_bound(a, a + 5, 3) - a; //返回3
本文算法思想源于Acwing,特此注明。

浙公网安备 33010602011771号