洛谷OJ记录
记录一哈刷洛谷的一些技巧和函数
万能头文件#include<bits/stdc++.h>
它几乎包含了你能用到的所有头文件。。。。
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set>
用cout进行小数格式输出
首先要加头文件:#include<iomanip>
setprecision、fixed、showpoint
cout<<setprecision(n)<<num; //输出n位数(包括整数),有四舍五入但是不会显示多余0比如1.1000输出1.1 cout<<showpoint<<setprecision(n)<<num;//输出n位数,并且会输出0,有四舍五入 cout<<fixed<<setprecision(n)<<num;//此时n指的是小数位数,有四舍五入,会输出多余0
https://blog.csdn.net/u011321546/article/details/9293547
<algorithm>下的sort()
sort( begin, end) / sort( begin, end , cmp)
不传递cmp时,默认是升序
bool cmp(int a, int b) { return a > b;//实现降序或者其他顺序,当返回值为true时则进行交换 } int main() { int a[] = {1,3,7,2}; sort(a,a + 4,cmp);//a+n表示 a之后n*sizeof( type )的内存地址 }
STL的sort函数在数据量大时采用快排,将分段再递归排序,一旦分段后的数据小于某个值,就改用插入排序。如果递归层次过深,还会改用堆排序。这样就结合了各类算法的所有优点。
<vector>
vector是顺序存储的,支持随机存取,其实和数组没什么区别,只不过加了很多方法
vector的初始化、重分配、插入删除:
#include<algorithm> vector<type> v;//声明,不分配内存 vector<type> v(n);//声明并分配n个sizeof(type)的内存
vector<type> v(num,value);//初始化num个值为value的vector v.capacity();//元素预定的上限,默认是元素个数+1 v.size();//当前元素数量 v.reverse(int n);//给v重新预约元素上限(v.capacity()),并不直接改变内存大小 v.resize(int n);//不仅把v.capacity变为n,还分配内存 v.push_back(type elem);//不管前面有没有空的地方,在末尾新分配一块内存存储 v.insert(iterator v.begin()+n , type elem);//新分配一个内存,从指向的元素开始把所有的都往后移,elem取代指向的元素位置 v.erase(v.begin()+n);//删除第n个元素,会重新生成一个vector v.erase(v.begin()+a , v.begin()+b);//从 a 位置开始删除到 b 前一个位置
1 //迭代器访问 2 vector<int>::iterator it; 3 for(it=vec.begin();it!=vec.end();it++) 4 cout<<*it<<endl;
<string>
这里面的门头就大了
#include<string>
string s = "1234";
s.erase( int pos, int n);//删除从pos 位开始的n个字符
s.erase( s.begin()+n );//删除指定位置的字符
s.erase( s.begin()+l, s.begin()+r );//删除从 left 位开始的到 right前一位的所有元素
s.find( string s);//返回子串s 第一次出现的下标,如果不存在,返回string::npos,这是一个unsigned int 的 -1,如果用一个整数变量接收它,那就能转化为int的-1
s1 < s2; // 按asc码序(字典序)进行比较
s1.compare(s2);//s1<s2,返回-1,s1==s2,返回0,s1>s2,返回1。 同理对于<string.h>中的strcmp(s1,s2)也是如此
//字符串的反转
#include<algorithm>
reverse(str.begin(),str.end());
//字符串截取
s.strsub(pos);//截取pos 开始的后续所有字符
s.strsub(pos, n);//截取 pos 开始的后n 个字符
//字符串替换
s.replace(pos , n , s2);//用s2替换pos 开始后的n个字符
string和int的转化:
to_string( num );
#include<string> int a = 111; double b = 1.11; string s = to_string(b);
atoi(),stoi() 包含在#include<string>,不是c++11的可以在#include<cstring>。作用是将字符串转化为int型。区别是stoi的形参是const string*,而atoi的形参是const char*。c_str()的作用是将const string*转化为const char*。
#include<string> string s1("1234567"); char* s2 = "1234567"; int a = stoi(s1); int b = atoi(s2); int c = atoi(s1.c_str());