头包
#include <iostream>
using namespace std;
万能头
#include<bits/stdc++.h> // 万能头,记住
using namespace std;
输出cout
endl 换行
cout<<"hello c++"<<endl; //输出字符串,endl换行
char c = 'c'; //定义字符变量
cout<<c<<endl; //输出字符变量
string str = "hello"; //定义字符串变量
cout<<str<<endl; //输出字符串变量
输出保留两位小数 printf
float f = 3.3333;
printf("%.2f",f); //输出 3.33
const 只读
const int a = 10; // 变量a 初始化后不可修改
auto 相当于泛型
auto a = 10;
auto b = "hello world";
auto c = true;
字符串
字符串 + 法运算
string str1 = "hello ";
string str2 = "world!";
string str3 = str1+str2; //str3 = "hello world!"
获取字符串长度 size()
s.size();
strlen 获取字符串长度 stdio.h 包
strlen(str);
判空函数 empty()
s.empty();
字符串按索引查找字符,可以当成数组[]
s[index];
子串查找find(),返回索引
string s = "hello world!";
int pos = s.find("llo"); //返回 pos = 2
int pos2 = s.find("xjz"); //未找到,返回无效索引 pos=string::npos
if(pos2==string::npos) cout<<"未找到";
子串替换 replace(int start , int end, string str) //左闭右开
string s = "HelloYou";
s.replace(5,8,"Xjz"); //输出HelloXjzld
cout<<s;
截取子串 substr(int startindex , int size);
string s = "Helloyou";
string s2 = s.substr(5,3); //s2 = "you"
cout<<s2;
//size 大于原串长度,则截取往后全部,不会报错
string s3 = s.substr(5); //表示截取从5到后面全部,s3 = "you"
字符串插入insert
字符串 str.insert(index,size,char) 在指定下标插入长度为size的字符,用来填充前导0
A.insert(0,lenB-lenA,'0'); // 字符串insert(index,size,char) 在指定下标插入长度为size的字符
字符串输入 getline 获取整行
cin 默认接收到 空格/回车 后退出,用 getline 读整行不会被空格截断。
string s1;
getline(cin,s); //读整行,不会被空格截断
翻转字符串
//引入 algorithm 包
reverse(str.begin(),str.end()); //翻转字符串
要修改形参需要加 & 符
getchar(); //输入字符,可以用来吸收回车键
工具——编译选项——编译器——编译时加入这个命令——
-std=c++11
转型
字符串->整型stoi
string a = "100";
int aa = stoi(a);
整型->字符串to_string
string aaa = to_string(aa);
输入cin,默认用空格或回车间隔
int a;
float b;
cin>>a>>b; //默认用空格或回车间隔
数组
数组定义和初始化
int arr[5] = {1,2,3,4,5};
string str[2] = {"acdc","d"};
数组初始化
memset 函数用法 memset(矩阵地址,指定值,大小)
long long color[n+2][m+2];
memset(color, -tol ,sizeof(color) );
加强 for 循环
for(auto i : arr){
cout<<i<<" ";
}
把二维数组当形参传递时 int (*nums)[100]
int nums[100][100];
void exchange(int (*nums)[100],int n,int cur,int max){}
exchange(nums,n,i,max)
(*nums)
:这表示nums
是一个指针,因为*
是指针解引用操作符。即*nums
表示指针指向的值,类型是一个长度为 100 的整型数组。[100]
:这表示指向的值是一个长度为 100 的整型数组。
容器 vector
头文件
#include <vector>
初始化
vector <int> vec = {1,2,3,4,5};
按索引顺序读取元素[]
vector <int> vec = {1,2,3,4,5};
vec[1]==1;
获取 vector 的大小 size()
vec.size(); //输出5
vector 递增排序
sort ( vec.begin() , vec.end() );
vector 作形参改变值要加 引用&
vector 加强 for 循环,改变值要加 引用&
for(auto &p : vec){ //加 & vec里的值才会真的修改
if(p==3) p=300;
}
vector 迭代器
for(vector<int>::iterator it = vec.begin() ; it != vec.end() ; it++ ){
cout<<*it<<endl; // it是指针,指向地址,需要加取地址符*
}
for(auto it = vec.begin() ; it != vec.end() ; it++ ){
// vector.begin(); 为第一个元素的地址
// vector.end(); 为最后一个元素后面的一个地址,实际指向空
}
vector.begin() 和 vector.end()
vector.begin(); 为第一个元素的地址
vector.end(); 为最后一个元素后面的一个地址,实际指向空
二维数组
vector<int> vec[n]; // n 个 vec 动态数组
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int temp;
cin>>temp;
vec[i].push_back(temp);
}
}
在末尾添加元素 push_back()
vec.push_back();
在指定位置添加元素 insert(int pos , int element)
pos 要传入地址 vec.begin()+index
vector<int> vec = {1,2,3,4};
vec.insert(vec.begin()+1 , 100); //vec={1,100,2,3,4}
删除末尾元素 pop_back() ,返回 null
vec.pop_back();
删除指定位置元素 erase(int pos);
vector<int> vec = {1,2,3,4};
vec.insert(vec.begin()+1,100); //vec={1,100,2,3,4}
vec.erase(vec.begin()+1); //vec={1,2,3,4}
清空所有元素 clear()
vec.clear();
如果要把容器当数组作形参传递
void fun(string str[], int size){
}
vector<string> vec; // 定义容器
string *str = vec.data(); // 得到容器的索引
fun( str , vec.size());
set 容器
特点:
自动去重
自动递增排序
头文件
#include <set>
查找 find(auto element)
用set 容器在集合中查找操作 find(),返回值为一个地址。
string 的find 返回的是索引下标,注意区分。
ss.find(val)!=ss.end(); //查找成功
ss.find(val)==ss.end(); //查找失败
set<int> ss = {1,2,3,4,5};
if(ss.find(2)!=ss.end()){
cout<<"查找成功";
}
插入 insert(auto element)
set<int> ss = {1,2,3,4,5};
ss.insert(1); //不能插入重复元素,但不报错。自动去重
ss.insert(100); // {1,2,3,4,5,100}
ss.insert(50); // {1,2,3,4,5,50,100}。自动排序
迭代器遍历 set
for(auto it=s.begin();it!=s.end();it++){
cout<< *it;
}
unordered_set 容器
特点
无序。本质上是 hash表 ,时间复杂度 O(1);
set 本质上是红黑树,时间复杂度更高。
map 集合
特点:
存放键值对
自动根据 key 值升序排序
定义和初始化
map<string,int> m;
m["aaa"] = 10;m["bbb"] = 15;
增加键值对
m["ccc"] = 20;
获得键 e.first / 获取值 e.second
for( auto e :m){
cout<<e.first<<" "<<e.second;
}
unordered_map 集合
无序
结构体
定义、初始化、访问属性
//定义
struct Student{
int age;
string name;
float score;
};
int main(){
//初始化
Student s = {18,"xjz",66.0};
//访问属性
s.name = "hsp";
return 0;
}
在存入vector的同时对结构体初始化
struct Student{
string id;
int Gp;
int Gm;
int Gf;
int g;
};vector<Student> vec;
string id;
int Gp_score;
cin>>id>>Gp_score;vec.push_back( Student{id,Gp_score,-1,-1,0} ); // 把student初始化存入vector保存
链表
struct ListNode{
int val;
ListNode *next;
};
指针
空指针 nullptr
定义指针
int* p; // p 是一个指针类型的变量
取地址
int a = 10;
int* p;
p = &a; //p 指向 变量a的地址
cout<<p; //输出 0x7ff7bfefef38
cout<<*p; //输出 10
动态分配
int* p = new int; //动态分配
*p = 10;
delete p; //释放空间
int* a = new int[5]; //动态分配数组
delete[] a; //释放数组
Student* p = new Student; //动态分配结构体
p->age = 18; //指针访问结构体属性用 ->
* 访问数组
int a[5]={1,2,3,4,5};
int* p = a;
cout<<p; //输出 0x7ff7bfefef20
cout<<*p; //输出 1
cout<<*(p+1); //输出 2
math 头文件
头文件
#include<cmath>
开平方 sqrt
int n = 9;
int s = sqrt(n); //s=3;
向下取整 floor
返回值是 double 类型
n次方 pow(int num ,int power)
int n = 2;
int square = pow(n,2); //平方
int cube = pow(n,3); //立方