CSP语法基础题(六)
CSP语法基础(六)-常用库函数
- 位运算
a = 110110(二进制下); // 想要取这个二进制数的第k位数字是0还是1,方法先将第k位数字移到最后一位就是个位,然后&上1,是0就是0,是1就是1;
// 取出二进制数的第k位,观察是0还是1
cout << (a>>k)&1;
x = 1010;
lowbit(x); //lowbit会返回最后一位1以及之后的所有0 此例返回的就是10
x1 = 1011000;
lowbit(x1); //lowbit返回的就是1000 PS:计算机里面负数的实现是取反再加上1
// 正数 a就是a
// 负数 -a就是 ~a+1
#include <iostream>
using namespace std;
int main(){
int a = 131432;
int b = -a;
int c = ~a+1;
cout << b << " == " << c << endl; //可以看到确实是相等的
return 0;
}
![截屏2021-03-09 17.30.08](/Users/liufeng/Desktop/截屏2021-03-09 17.30.08.png)
————————————————————————————————————————————
#include <algorithm>
#include <iostream>
#include <vector>
#include <ctime>
//算法库
using namespace std;
int main(){
//reverse函数
int a[] ={1,2,3,4,5};
vector<int> b({1,2,3,4,5});
reverse(b.begin(),b.end());//既可以翻转数组也可以翻转vector
for(int c:b) cout << c << endl;
//翻转数组
reverse(a,a+5)//类似于begin\和end
for(int cc:a) cout << cc << " ";
//unique函数 去重函数,并且把不相同函数都放在数组的最开头,并返回去重后数组的下一个元素,像end尾迭代器 和reverse函数一样第一个参数是begin,第二个参数是end
int m = unique(b.begin(),b.end())-b.begin(); //返回的就是去重后元素的数量
/* vector的写法
vector<int> a({1,1,2,3,4,5,5,8});
int m = unique(a.begin(),a.end()) - a.begin();
*/
//random_shuffle函数 自己生成的数组打乱数据,帮助生成随机数据
srand(time(0)); //返回当前时间到1970/7/1的一个秒数,此举就是改变了随机种子
vector<int> b({1,2,3,4,5}); //原本是有序的
rondom_shuffle(b.begin(),b.end()); //这样一来顺序就随机打乱了 不过这个随机是伪随机
//要想使用正真的随机,必须改变随机种子,一般是把时间传进去作为随机种子,添加头文件time
//sort函数 参数也是和reverse函数一样,但是一般默认的是从小到大排序
//要想从大到小排序,还得添加第三个参数greater<int>
sort(a.begin(),a.end(),greater<int>); //按照从大到小的顺序
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
//使用sort函数对结构体进行排序
struct Rec{
int x,y;
};
bool cmp(Rec a,Rec b){
return a.x > b.x; //根据x进行比较
}
int main(){
Rec a[10];
for(int i=0;i<10;i++){ //赋值操作
a[i].x = -i;
a[i].y = i;
}
for(int i=0;i<10;i++){
cout << a[i].x << " " <<a[i].y;
}
//高能!!!
sort(a,a+10,cmp); //cmp的返回值是bool值
return 0;
}
Lower_bound()函数和upper_bound()函数
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[] ={1,2,3,4};
lower_bound(a,a+4,3); //和unique一样返回的是迭代器尾 功能是返回大于等于值是3的数中的第一个迭代器
//
int* p = lower_bound(a,a+4,3);
cout << *p << endl;
int* q = upper_bound(a,a+4,3); //返回严格大于3的第一个元素的位置
cout << *q << endl; //名字容易误导啊
return 0;
}