C++知识点总结用于打算法
🌃大纲
🌃基础篇
using namespace std
#include <iostream>
using namespace std;
int main(void)
{int n;cin>>n;cout << "woshi" << n++ <<endl;return 0;}
#include <iostream>//input output stream输入输出流
using namespace std;//cin cout在std这个东西里面
int main(void)
{int n;cin>>n;//== scanf("%d",&n) cout << "woshi" << n++ <<endl;//enl是换行符,'\n' return 0;}
#include <iostream>
// using namespace std;
int main(void)
{int n;std::cin>>n;std::cout << "woshi" << n++ << std::endl;return 0;}
cin cout 头文件
cin cout 的运算速度不如scanf 和 printf
头文件:去掉.h 直接在开头加c
#include<cstring>//#include<string.h>
#include<cmath>//#include<math.h>
变量声明
for循环里面可以直接定义
#include<iostream>using namespace std;int main(void){int n;cin >> n;for(int i=0;i<10;i++)cout << n << "";cout << endlfor(int i=0;i<10;i++)cout << n+1 << "";return 0;}
bool变量
非0为true,0为false
#include<iostream>
using namespace std;
int main(void){bool flag = true;bool flag2 = -1;bool flag3 = 0;cout << flag << " " << flag2 << " " << flag3 << endl;return 0;
}
const定义常量
#include<iostream>
using namespace std;
int main(){const int MAX = 150;cout << MAX <<endl;//define MAX 150return 0;}
string类
- 定义:string_s = "hello"
- 拼接:s=s1+s2
- 输入(出):cin >>s
cout << s << endl
getline(cin,s)
4.输出:s.length( )
s1 = s.substr(n,m) 或 s1= s.substr(n)
#include<iostream>
using namespace std;
int main(void){string s = "hello";string s2 = "world!";string s3 = s + s2;cin >> s;cout << s <<endl;return 0;
}
因为有空格,没办法完全打印出来
#include<iostream>
using namespace std;
int main(void){string s = "hello";string s2 = "world!";string s3 = s + s2;getline(cin,s);cout << s <<endl;return 0;
}
#include<iostream>
using namespace std;
int main(void){string s = "hello";string s2 = "world!";string s3 = s + s2;getline(cin,s);cout << s <<endl;cout << s.length() << endl;return 0;
}
#include<iostream>
using namespace std;
int main(){string s = "hello world!";cout << s << endl;string s_sub = s.substr(6);cout << s_sub << endl;return 0;
}
#include<iostream>
using namespace std;
int main(){string s = "hello world!";cout << s << endl;string s_sub = s.substr(6,4);cout << s_sub << endl;return 0;
}
结构体
可以省去struct
#include <iostream>
using namespace std;
struct stu {string name;int age;
};int main(void){stu a[10];//struct stu a[10]return 0;
}
引用&
int &a
#include<iostream>
using namespace std;
void c(int &a){a += 1;
}
int main(void){int a = 4;c(a);cout << a << endl;return 0;
}
vector
1.头文件:#include<vector>
2.创建数组:vector<int> v(10,2)//分配10个空间,每个空间默认值为2
vector<int> v(10)//==v(10,0)
vector<int> v
元素值默认为0
3.分配数组大小:v.resize(length)
4.末尾添加新的数据:v.push_back(data)
5.迭代器:for(auto p=c.begin(); p!=c.end(); p++){
cout << *p << "";
}//for循环,不管是否有添加,都自动打印出来,不用修改循环条件
注意切换到c++11(版本不行)
#include<iostream>
#include<vector>
using namespace std;
int main(void){vector <int> v;//创建数组 v.resize(10);//分配数组(长度为10) for(int i=0;i<10;i++)v[i] = i;v.push_back(11);//末尾添加新的数据 for(int i=0;i<11;i++)cout << v[i] << " ";return 0;}
#include<iostream>
#include<vector>
using namespace std;
int main(void){vector <int> v;v.resize(10);v.push_back(11);for(auto p = v.begin(); p!=v.end();p++)cout << *p << " ";return 0;
}
set
1.set是集合,它里面的元素各不相同,而且元素会从小到大排序
2.头文件:#include<set>
3.创建集合:set<int> s; s的后面不可以加内容
4.插入:s.insert(data);
遍历:迭代器
查找:s.find(data) s.find()返回值是一个指针
删除:s.erase(data);
#include<iostream>
#include<set>
using namespace std;
int main(void){set<int> s;s.insert(1);s.insert(2);s.insert(3);cout << (s.find(2) != s.end()) << endl;cout << (s.find(4) != s.end()) << endl;s.erase(1);cout << (s.find(1) != s.end() )<< endl;return 0;
}
map(键值对)
#include<iostream>
#include<map>
using namespace std;
int main(void){map <string,int> m;m["hello"] = 2;m["world"] = 3;cout << "hello:" << m["hello"] << endl;for(auto p=m.begin(); p!=m.end(); p++)cout << p->first << ":" << p->second << endl;return 0;
}
stack(栈)
头文件:#include<stack>
创建栈:stack < int> s;
压栈:s.push(i);
出栈:m.pop();
访问栈顶:s.top();
获取长度:m.size();
#include<iostream>
#include<stack>
using namespace std;int main(void){stack <int> s;s.push(1);s.push(2);s.push(3);s.pop();s.push(76);cout << s.top() <<endl;cout << "栈的长度为:" << s.size() << endl;return 0;
}
queue(队列)
头文件:#include<queue>
创建队列:queue <int> s;
入队:s.push(i);
出队:s.pop();
访问:访问队首:s.front();
访问队尾:s.back();
获取长度:s.size();
#include<iostream>
#include<queue>
using namespace std;
int main(void){queue <int> s;for(int i=1;i<=10;i++)s.push(i);cout << "队首为:" << s.front() << endl << "队尾为:" << s.back() << endl;s.pop();cout << "队首为:" << s.front() << endl << "队尾为:" << s.back() << endl;s.push(11);cout << "队首为:" << s.front() << endl << "队尾为:" << s.back() << endl;cout << s.size() << endl;return 0; }
unordered_map 和 unordered_set
这2个其实就是不会排序的map(键值对)和set集合,它们省去了排序的过程,如果刷题的时候超时了,可以使用
#include<iostream>
#include<unordered_map>
#include<unordered_set>
using namespace std;int main(void){unordered_map <string,int> m;unordered_set <int> s;s.insert(1);s.insert(7);s.insert(5);m["hello"] = 1;m["world"] = 2m["ha"] =3;m["hlkwe"] = 4;m["hdskj"] = 5;for(auto p=s.begin();p!=s.end();p++)cout << *p <<endl;for(auto p=m.begin();p!=m.end();p++)cout << p->first << "" << p->second << endl;return 0;
}
🌃进阶版
bitset 位运算
主要功能是对一个数组(int arr[] 或者(vector)进行排序,vector是容器,需要用v.begin()表示头,v.end()表示尾;而int arr[]使用arr表示数组的首地址,arr+n表示尾部
sort函数
主要功能是对一个数组(int arr[]或者vector)进行排序,vector是容器,需要用v.begin()表示头,v.end表示尾;而int arr[]使用arr表示数组的首地址,arr+n表示尾部
头文件:#include<algorithm>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;int main(void){vector <int> m(10);for(int i=9;i>0;i--)m[i] = 10-i;m.push_back(-1);for(int i=0;i<10;i++)cout << m[i] << " ";cout << endl;sort(m.begin(),m.end());//[ )for(int i=0;i<11;i++)cout << m[i] << " ";
}
使用sort 自定义 cmp函数
sort默认是从小到大排序
cmp允许我们定义一些比较复杂的规则
原理:bool cmp(int x,int y)
如果返回值为真,那么x放在y前面(返回值为假时,交换2个数)
否则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(stu a,stu b){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=0;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头文件
isalpha(); 字母?
islower(); 小写字母?
isupper(); 大写字母?
isalnum(); 字母or数字?
isspace(); space \t \r \n?
tolower(); 转化为小写字母
toupper(); 转化为大写字母
#include<iostream>
#include<cctype>
using namespace std;
int main(void){char c = '1';cout << "isalpha:" << isalpha(c) << endl;cout << "islower:" << islower(c) << endl;cout << "isupper:" << isupper(c) << endl;cout << "isalnum:" << isalnum(c) << endl;cout << "isspace:" << isspace(c) << endl;char s = tolower(c);cout << s << endl;char s1 = toupper(c);cout << s1 << endl;return 0;
}
🌃c++篇
auto声明
作用:可以让编译器根据初始值直接推断变量的类型 auto x = 100;
auto y = 1.5;
推广:迭代器 替换set<int> :: iterator
#include<iostream>
#include<vector>
using namespace std;
int main(void){auto x = 19;auto y = 1.8;cout << x << " " << y << endl;vector<int> a(10,1)for(auto p =a.begin();p!=a.end();p++)cout << *p << " ";return 0;
}
基于范围的for循环
传值:for(int i:arr)
cout << i << endl; 输出数组中的每一个元素的值。这里不能改变元素的数值
传址:for(int &i:arr)
i=i*2 将数组中的每一个元素都乘于2,只有在引用的时候才能改变元素的值
推广:for(auto i:v)
cout << i << " "; 这里的v是一个vector,其实所有的容器都可以使用这种方式来循环
#include<iostream>
#include<vector>
using namespace std;
int main(void){int a[5] = {1};for(int i:a){i++;cout << i << " ";}cout << endl;return 0;
}
#include<iostream>
#include<vector>
int main(void){int a[5] = {1};for(int i:a){i++;}for(int i:a)cout << i << " ";cout << endl;return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main(void){vector <int> b{10,1};for(auto i:b)cout << i << " ";cout << endl;return 0;
}
to_string
作用:将数字转化为字符变量
头文件:#include<string>;
使用方法: string s = to_string(123.1);
printf("%s\n",s.c_str());
#include<iostream>
#include<string>
using namespace std;
int main(void){string s = to_string(123.1);cout << s << endl;printf("%s\n",s.c_str());return 0;
}
stoi stod
作用:将字符串转化为其他变量
处理: stoi :转化为int型 || int a= stoi("123");
stod: 转化为double型 || double b = stod("123.56");
补充: stof stold stol stoll stoul stoull
#include<iostream>
#include<string>
using namespace std;
int main(void){int a = stoi("123");cout << a-1 << endl;double b = stod("12.34");cout << b-1;return 0;}