文章目录
基本数据类型的定义
绝对值在10^9
范围以内可以定义成int型,在10^18
范围以内定义成long long
型,
若long long
型赋值大于2^31-1
的初值,需要在初值后面加上LL,否则会编译错误
printf
输出格式
%md
不足m位的int
型变量以m位右对齐输出,%-md
以左对齐方式输出, 若数值大于m位,保持原样输出
%0md
变量不足时用0填补
%.mf
让浮点数保留m为小数
常用的#include<cmath>;
头文件
fabs(double x);//对double取绝对值
floor(double x);//对x向下取整
ceil(double x);//对x向上取整
pow(double r,double p);//r^p
sqrt(double x);//算数平方根
log(double x);//以自然对数为底的对数
sin(double x)、cos(double x)、tan(double x)//正弦、余弦、正切值
asin(double x)、acos(double x)、atan(double x)//反正弦、反余弦、反正切
round(double x);//对x四舍五入
**上面函数参数要求为double
类型 **
string
初始化
string s;//默认初始化,一个空字符串
string s1("ssss");//s1是字面值“ssss”的副本
string s2(s1);//s2是s1的副本
string s3=s2;//s3是s2的副本
string s4(10,'c');//把s4初始化,长度为10的 c的字符串
string s5="hiya";//拷贝初始化
string s6=string(10,'c');//拷贝初始化,生成一个初始化好的对象,拷贝给s6
//char cs[]="12345";
string s7(cs,3);//复制字符串cs的前3个字符到s当中
// string s8="asac";
string s9(s8,2);//从s8的第二个字符开始拷贝,不能超过s8的size
//string s10="qweqweqweq";
string s11(s10,3,4);//s11是s10从下标3开始4个字符的拷贝,超过s10.size出现未定义
常用函数
//字符串中的find函数,若找不到字符,会返回string::npos,即是-1;
string s1=“hello,word";
if(s1.find(h)!=string:npos)
flag=1;
string 类提供了 6 种查找函数,每种函数以不同形式的 find 命名。
这些操作全都返回 string::size_type 类型的值,以下标形式标记查找匹配所发生的位置;
或者返回一个名为 string::npos 的特殊值,说明查找没有匹配。string 类将 npos 定义为保证大于任何有效下标的值。
s.find("ha",3)//从位置3开始查找“ha”子串
s.find*()
s1.erase(4,1);//去除4位置上 一个字符
s1.erase(3);//从位置3开始去除字符到结尾
//在0位置插入len个'0'
s.insert(0,len,'0');
sort(s1.begin(),s1.end(),cmp);//给s1字符串中排序
s.length() s.size()//取串的长度
string s2=s.substr(4);//从下标4开始一直到结束
string s3=s.substr(5,3) //从下标5开始 截取3个字符
s.append(s2);//append()函数可以用来在字符串的末尾追加字符和字符串。由于string重载了运算符,也可以用+=操作实现
s.compare(s2)//和strcmp函数一样,如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1
vector
动态数组或者不定⻓数组它能够在运⾏阶段设置数组的⻓度、在末尾增加新的数据、在中间插⼊新的值、⻓度任 意被改变
定义
-
头文件
#include<vector>
-
不指定大小
vector<int> v;
-
定义时指定大小且默认初始都是0
vector<int> v(10);
-
定义时指定大小并将所有元素赋特定的值
vector<int> v(10,2);
常用方法
v.size(); //输出vector v的大小
v.resize(8); //将vector v的大小设为8,且默认值是0
v.push_back(i); // 在vector v的末尾添加一个元素
set
set 是集合,⼀个 set ⾥⾯的各元素是各不相同的,⽽且 set 会按照元素进⾏从⼩到⼤排序
定义
头文件 #include <set>;
定义空集合 set<int> s;
常用方法
s.size(); //输出set s的大小
s.insert(1); //向集合s中插入一个1
s.find(2); //返回一个指向被查找到元素(2)的迭代器
s.eraser(1); //删除set中值是1的元素
map
map 是键值对,会⾃动将所有的键值对按照键从⼩到⼤排序
定义
-
头文件
#include <map>
-
定义map
map<string,int> m
常用方法
m.size(); //输出map m的大小
m["hello"] = 3; //向map m中键hello的值改为3
⽤迭代器it遍历,输出map中所有的元素,键⽤it->first获取,值⽤it->second获取
stack
定义
-
头文件
#include <stack> ;
-
定义stack
stack<int> s;
常用方法
s.size(); //栈的元素个数
s.push(i); //向stack s中加入元素i
s.top(); //取出栈顶元素
s.pop(); //弹出栈顶元素
queue
定义
-
头文件
#include<queue>;
-
定义
queue<int> q;
常用方法
q.size(); //队列的元素个数
q.push(i); //像队列中压入i
q.front(); //取出队首元素
q.pop(); //弹出队首元素
unordered_map和unordered_set
省去了这个排序的过程,如果偶尔刷题时候⽤ map 或者 set 超时了,可以考虑 ⽤ unordered_map (或者 unordered_set )缩短代码运⾏时间、提⾼代码效率
定义
- 头文件
#include<unordered_map>
#include<unordered_set>
常用方法
⽤法和 map 、 set 是⼀样的
bitset
处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值。
定义
-
头文件
#include<bitset>;
-
定义bitset里面都为0
bitset<5> b;
-
指定bitset里面的值可以是unsigned int和字符串
bitset<5> b(s);
-
指定bitset中的内容是某字符串中i开始的n长度的部分
bitset<5> b(s,i,n);
常用方法
cout << b <<endl; //以正常顺序输出
cout << b[i] << endl; //按位输出是逆序,是从二进制的低位到高位
b.any(); //b中是否此存在1的二进制位
b.none(); //b中不存在1吗
b.count(); //b中1的二进制位的个数
b.size(); //b中二进制位的个数
b.test(2); //b中下标位2的地方是否是1
b.set(4); //把b中下标是4的位置置1
b.reset(); //b中所有位清0
b.reset(3); //b中下标位3处的位置清零
b.flip(); //b的所有二进制位逐位取反
unsigned long a = b.to_ulong(); //b转换为unsigned long类型
sort函数
主要是对一个数组进行排序(int arr[]
数组或者vector
数组都行)
定义
- 头文件
#include<algorithm>;
- 底层类似于快速排序
用法
sort(起始地址,结束地址,排序函数地址(默认非降序))
-
对于
int arr[]
来说是sort(arr, arr+n);
-
对于
vector
容器来说是```sort(v.begin, v.end);`` -
对于自定义的排序函数,更多的是在结构体中来使用
柳神的小例子,如果分数不同则从高往底排序,如果分数相同则按学号的大小排序
struct stu { int number; int score; } bool cmp(stu a,stu b) { return a.score!=b.score ? a.score > b.score : a.number < b.number); }
并且sort中自定义的函数的返回值只能按照规定来写,
return a > b;
或者return a < b;
不可以>=或者<=;cctype
头文件里面包含一些刷题常用到的判断字符的函数
常用方法
isalpha 字母 islower 小写字母 isupper 大写字母 iaslnum 字母和数字 isbank space和\t isspace space,\t,\r,\n //\r是将光标位置移到本行的开始 tolower 大写转小写 char t = tolower(c); toupper 小写转大写 char t = toupper(c);
char c; cin >> c; if(isalpha(c)) cout << "is alpha" << endl;
auto声明
根据变量的初始值直接判断变量的类型
auto a = 100.0;
主要的使用是在用迭代器遍历容器的时候,我说一下自己对于迭代器的一点浅显的理解:
每一种容器中都定义了自己的迭代器iterator,在定义容器的源码中,容器的的类中有一个内部类定义的是迭代器,我们定义的迭代器实际上就是该类的一个对象,所以如果不加auto声明的时候应该写成(这里用set来举例子)
set<int>::iterator it;
而set中还有获取set的首末(末尾的下一个地址)的地址等类似函数,且iterator源码中的定义就是一个指向自己所在的容器的元素的指针因此有it = s.begin();
等。
所以在遍历容器的时候我们可以很方便的写成
for(auto it = s.begin();it != s.end();it ++)
基于范围的for循环
-
如果要输出arr[]数组中的每个元素
for(int i : arr) cout << i << endl;
-
如果要输出容器中的每个元素用vector来举个列子
for(int i: v) cout << i << endl;
这种写法只能用来输出元素的值,不可以改变元素的值,如果想要修改值得话,必须要int &i
```C++
for(int &i : arr)
i = i * 2;
```
string和数值之间的转化
to_string
to_string最常用得方法就是将一个int,float。double等转化成string字符串
float a = 123.0;
string s = to_string(a);
关于转化后得字符串长度还没搞清楚怎么回事,搞懂之后会做修改
stoi``````stod``````stol
将string转化成int,double,long,这里得string只能是数值型得字符串
string s = "345";
int a = stoi(s);
for(int &i : arr)
i = i * 2;
```
# string和数值之间的转化
## to_string
to_string最常用得方法就是将一个int,float。double等转化成string字符串
```C++
float a = 123.0;
string s = to_string(a);
关于转化后得字符串长度还没搞清楚怎么回事,搞懂之后会做修改
stoi``````stod``````stol
将string转化成int,double,long,这里得string只能是数值型得字符串
string s = "345";
int a = stoi(s);
本文结合了柳婼大神的从C到C++和我同学一些整理,建议大家可以去买一份柳婼大神的文档很不错哦