语法篇:
头文件声明:
#include<iostream> => 相当于c语言stdio.h
#include<cmath> => 相当于c语言math.h
什么.h可以转化为c什么来代替
使用库说明:
不同厂商不一样可能发生冲突
using namespace std;
如果没有声明,在运用到里面函数时就要std::cin
输入输出说明: cin >> 变量;
getline(cin,a); //可以输入带有空格的字符串
count << 变量 << endl; //endl是换行符
变量.length(); //读取字符串长度
变量.substr(n,m) 或 变量.substr(n);//取子串
这里的n是从第几个字符开始,m是n后面取几个字符
结构体:
定义结构体后可以直接用struct后面那个单词来定义结构,免去了c语言里typedef的步骤
引用&:
引用符号可以将所引用的参数传递,可以修改该参数的值,免去了c语言用指针传值的步骤
STL篇:
vector:
头文件加上include<vector>
可变数组的定义:
vector <int>数组名;
vector <int>数组名(10);//分配十个空间,每个空间初始化为0
vector <int>数组名(10,2); //分配十个空间,每个空间初始化为2
数组名.resize(数字); //分配数组大小,初始化也为0
数组名[i]; //访问里面的元素
v.push_back(数字) //末尾添加新的数据
迭代器:
for(auto p = v.begin() ; p != v.end() ; p++ )
此处定义v为数组名,与循环一样遍历数组里的每一个元素
v.end的实际位置是在数组里最后一个元素的下一个位置
输出时为*p,这里的p相当于指针
set:
头文件加inlude<set>
set是集合,它里面的元素各不相同,而且元素会按照从小到大排序
set <int>数组名;//数组名后面不能带数字/空间
s.insert(数字) //给集合添加内容/数字
s.find(数字) //返回值是一个指针 与s.end作比较
s.find(2) != s.end() //返回的是布尔值
s.erase(数字) //把数字1删除
map:
头文件加上include<map>
map是键值对,它会自动将所有的键值对按照键从小到大排序
可以看作是一个结构体,一个键值对是一个结构体,类似定义了一个结构体数组
map <string, int > 名字;
名字["hello"] = 2 //添加元素
for( auto p=m.begin() ; p != m.end() ; p++ )
cout << p->first << ":" << p->second << endl
//用来获取所有的键值对
m.size() //获取map的长度,有几个键值对
stack:
头文件加上include<stack>
stack <int> 名字
名字.push(数字) //添加元素
名字.top() //获取栈顶元素
名字.pop() //出栈,把栈顶元素去掉
名字.size() //获取长度
不能用迭代器,因为栈只能对栈顶进行操作
queue:
头文件加上include<queue>
queue <int> 名字
for(int i = 1; i<=10; i++)
s.push(i) //添加元素
s.front() //访问队首元素
s.back() //访问队尾元素
s.pop() //出队,队首出队
s.size() //获取长度
unordered_map unordered_set:
头文件加上include<unordered_map>
头文件加上include<unordered_set>
这两个其实就是不会排序的map和set,他们省去了排序的过程,如果刷题的时候超时了,可以使用这两个
他们的输出是没有规律的
C++11篇:
auto:
用auto声明变量: 作用:可以让编译器根据初始值直接推断变量的类型
注意:在声明变量的时候就要给它初始值
迭代器可以作用的:
数组,集合,键值对(获取值类似于结构指针)
不可以:
栈,队列
基于范围的for循环:
传值:输出数组中的每一个元素的值,这里不能改变元素的数值
#include<iostream>
#include<vector>
using namespace std;
int a[5] = {1}; // 1 0 0 0 0
int main(void)
{
for (int i:a)
{
i++;
count << i << " ";
}
cout << endl;
return 0;
}
//输出结果为2 1 1 1 1,这里改变了值是因为输出放在了里面
#include<iostream>
#include<vector>
using namespace std;
int a[5] = {1}; // 1 0 0 0 0
int main(void)
{
for (int i:a)
{
i++;
}
for(int i:a)
count << i << " ";
cout << endl;
return 0;
}
//输出结果为1 0 0 0 0,这里未改变了值是因为输出放在了外面,说明该循环本身不能改变数组中元素的值
传址:只有在引用时才能改变元素的值
#include<iostream>
#include<vector>
using namespace std;
int a[5] = {1}; // 1 0 0 0 0
int main(void)
{
for (int &i:a)
{
i++;
}
for(int i:a)
count << i << " ";
cout << endl;
return 0;
}
//输出结果为2 1 1 1 1,这里改变了值是因为该循环本身能改变数组中元素的值
推广:
for(auto i:v)
cout << i << " "
这里的v是一个vector,其实所有的容器都可以使用这种方式来循环。(配合auto)
to_string:
头文件加上include<string>
作用:将数字转化为字符变量
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
string s = to_string(123.1)
count << s << endl;
printf("%s\n",s.c_str());
return 0;
}
stoi stod:
作用:将字符串转化为其他变量
处理:stoi 转化为int
stod转化为double
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
int a = stoi("123");
count << a-1 << endl;
double b = stod("12.34");
cout << b-1;
return 0;
}
进阶篇:
位运算:
头文件加上include<bitset>
bitset类似一个字符数组,但是它是从二进制的低位到高位依次为b[0],b[1]......,所以按照b[i]的方式输出和直接输出b的结果相反
bitset <5> b(19) 输出的二进制位数为5位 二进制转十进制后为19
如果括号里为字符串,默认放最后两位其余位补0
cout << b << endl //输出可以直接当字符串输出
b.any() //是否有1存在,返回bool值
b.none() //b不存在1吗
b.count() //b中1的个数
b.size() //b中元素个数
b.test(i) //下标为i处是不是1
b.set(i) //把下标i处设置为1
b.reset() //所有位归零
b.reset(i) //第i位归零
b.flip() //所有位取反
b.flip(i) //第i位取反
unsigned long a = b.to_ulong() //转换为unsigned long类型
sort:
头文件加上include<algorithm>
头文件加上include<vector>
主要功能是对一个数组(int arr[]或者vector)进行排序。vector是容器,需要用v.begin()表示头,v.end表示尾;而int arr[]使用arr表示数组的首地址,arr+n表示尾部
sort( m.begin(), m.end() ) //[ )
使用sort自定义cmp函数:
cmp允许我们定义一些比较复杂的函数的规则
bool cmp(int x,int y)
如果返回值为真。那么x放在y前面(返回值为假时,交换两个数) 否则x放在y后面
注意:cmp返回值部分必须使用>或者<,不能有>=或者<= 否则可能出现段错误
数组:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int x, int y)
{
return x > y;
}
int main(void)
{
vector <int> v;
for(int i=1; i<=10; i++)
v.push_back(i);
sort(v.begin(), v.end(), cmp);
for(auto p=v.begin(); p!=v.end(); p++)
cout << *p << " ";
cout << endl;
return 0;
}
结构体:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct stu
{
string name;
int age;
};
bool cmp(int x, int y)
{
if(a.age != b.age)
return a.age < b.age;
else
return a.name < b.name;
int main(void)
{
stu s[3];
for(int i=1; i<3; i++)
cin >> s[i].name >> s[i].age;
sort(s, s+3, cmp);
for(int i=0; i<3; i++)
cout << s[i].name << " " << s[i].age << endl;
return 0;
}
cctype:
头文件加上include<cctype>
对字符进行操作
isalpha() //是不是字母
islower() //是不是小写字母
isupper() //是不是大写字母
isalnum() //是字母或者数字其中一类吗
isspace() //是space \t \r \n 其中一个吗
tolower() //转化为小写字母
toupper() //转化为大写字母