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,特此注明。

posted @ 2020-09-23 21:40  AIchemistar  阅读(330)  评论(0)    收藏  举报