<cstring>
strlen()字符串长度
strcmp()字符串比较
strcpy()字符串拷贝
memset()暴力清空数组
memcpy()暴力拷贝
2.<cstdlib>
qsort() C语言快排
rand() 随机数
malloc() free() C语言动态分配内存
3.<ctime>
time(0) 从1970年到现在的秒数,配合随机数
clock() 程序启动到目前位置的毫秒数
4.<cctype>
isdigit() 判断字符是否为数字
isalpha() 判断字符是否为英文字母,小写字母返回2,大写字母返回1,不为字母返回0
常见操作:
vector<int>v; v.begin(); //数组的首元素迭代器 O(1) v.end(); //数组的最后一个元素的下一个元素的迭代器(该元素不存在) O(1) v.size(); //数组长度(元素个数) O(1) v.clear(); //一键清空数组 O(n) v.empty(); //判断数组是否为空 O(1) v.erase(it); //删除数组某个迭代器所在的位置的数字 O(n) v.push_back(5); //往数组后面添加元素 O(1) v.pop_back(); //删除数组后面最后一个元素 O(1)
常见操作:
string s="hello"; string str1="world"; s.length();/s.size(); //求字符串长度 O(n) s.insert(2,"abc"); //在下标为2处插入一个字符或者字符串 O(n) s.insert(s.begin(),'a'); ///在迭代器处插入一个字符或者字符串 O(n) s.c_str(); //返回C语言的字符串,用于输出printf O(n) s.append(str1); //s+str s.compare(str); //strcmp(s,str1); s==str1 //strcmp(s.str1)==0; s+=str1 //s.append(str1); s+='a'; //s.push_back('a'); s+="aa";
algorithm和之前两个头文件不同,它没有定义新的类型,只是定义了很多使用的算法,一个函数和传入的若干参数往往可以解决很多问题
int arr[]={4,5,2,1,3,6}; vector<int>v={4,5,2,1,3,6}; sort(arr,arr+6); //排序结果:1 2 3 4 5 6 sort(v.begin();v.end()); //排序结果:1 2 3 4 5 6 //O(nlogn) //sort函数里面有参数 //第一个参数是数组的头指针 //第二个参数是数组的最后一个元素的下一个元素的指针
//实际上还有第三个参数,如果第三个参数不写,sort将会从小到大排序 //第三个参数可以使用自定义的比较函数, //第三个参数也可以使用<functional>头文件里面的greater<type>和less<type> vector<int>v={4,5,2,1,3,6}; bool Mycompare(int a,int b) //自定义从大到小排序 return a>b; int main() { sort(v.begin(),v.end(),Mycompare); //排序结果:6 5 4 3 2 1 sort(v.begin(),v.end(),less<int>()) //排序结果:1 2 3 4 5 6 sort(v.begin(),v.end(),greater<int>()) //排序结果:6 5 4 3 2 1 }
//大部分情况下用greater<type>和less<type>,但是比较的是点的坐标的话就要使用自定义比较函数了 struct Point { int x; int y; }; bool Mycmp(Point a,Point b) //先降序排序点的横坐标,横坐标相同的所有点中降序排序点的纵坐标 { if(a.x!=b.x) return a.x>b.x; else return a.y>b.y; } int main() { Point arr[1005]; for(int i=0;i<5;i++) cin>>arr[i].x>>arr[i].y; sort(arr,arr+5,Mycmp); for(int i=0;i<5;i++) cout<<arr[i].x<<" "<<arr[i].y<<endl; }
测试案例
vector<int>v; min_element(v.begin(),v.end()) //返回第一个元素的指针 O(n) max_element(v.begin(),v.end()) //返回最后一个元素的指针 O(n) //这两个函数都是默认升序排序的,不要被 min 和 max 迷惑了 //以上两个函数都可以sort的变形,可以添加第三个参数 //即 greater<type> , less<type> , 自定义函数调整排序顺序 min(a,b); //返回a,b中较小的那个数 max(a,b); //返回a,b中较大的那个数 swap(v[0],v[1]); //交换任意两个同类型变量 O(1) reverse(v.begin(),v.end()); //将数组翻转 O(n)
nth_element()
函数vector<int>v={2,5,6,1,3,4}; nth_element(v.begin(),v.begin()+3,v.end()); //把数组第n小(从0开始算)的数放到第n个位置 //可以理解为快排的简化版,并且左边的数都比它小,右边的数都比它大 //O(n), sort的复杂度是O(nlogn),必要时刻还是要用这个函数的 //排序结果:2 1 3 4 6 5 //第三号也就是第四个数是4
unique()
函数vector<int>v={2,5,6,1,3,4,5,5}; sort(v.begin(),v.end()); //排序结果: 1 2 3 4 5 5 5 6 auto it=unique(v.begin(),v.end()); //排序结果 1 2 3 4 5 6 5 5 //使用unique前需要将数组排序 //unique的作用是将多余的数字放在数组的末尾 //返回的是一个数组末尾指针 所以*it=5 //O(n) int NewSize=unique(v.begin(),v.end())-v.begin(); //NewSize=6 //这是一种去重的方法,和set容器达成的效果一样 //数组里面的也只有 1 2 3 4 5 6这六个数字
binary_search()
函数bool IsEx=binary_search(v.begin(),v.end(),1); //前提排好序 //判断对应元素是否存在 O(logn)
lower_bound
函数和upper_bound
函数vector<int>v={1,2,3,4,5,6}; auto pos=lower_bound(v.begin(),v.end(),3); //前提排好序 //从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字 //找到返回该数字的地址,不存在则返回end //O(logn) auto pos=upper_bound(v.begin(),v.end(),3); //前提排好序 //从数组的begin位置到end-1位置二分查找第一个大于(没有等于)num的数字 //找到返回该数字的地址,不存在则返回end //O(logn)