语法记录
\(\texttt{titile}\)
计概与数算行末不要空格!!!
字符串与字符数组
cin >> str //字符与字符串,不含空格、制表符与换行
scanf("%c", &ch) //读单个字符 ch
scanf(" %c", &ch) //字符数组,忽略前面的空格与换行
scanf(",%c", &ch) //字符数组,忽略前面的 ','
scanf("%s", str) //字符数组,不含空格与换行
scanf("%[^\n]%*c", str) //字符数组,可读空格,直至换行结束,'%*c' 抑制符,读换行但不存储
getline(cin, str) //读整行,包括空格,至换行,不含换行
cin.ignore() // 忽略缓冲区中的换行符,防止 getline 读空行
fgets(str, sizeof str, stdin) //读整行,包括空格,至换行,含换行
printf("%s\n", str.c_str()) //输出 string 类型,即转 char[] 输出
类(class)
基本用法与结构体相同
class A {
private:
int a, f[N];
public:
A(){}
A(int aa):a(aa){} //初始化
~A(){delete a; delete [] f;} //析构函数,delete 释放内存
friend class B; //友元声明,类 B 可访问 private 成员函数
};
指针与引用 传参
指针是一种数据类型,传参时是副本,可&取地址后传递,但要参数定义为双重指针(双*),此时修改原变量
引用是变量的别名,引用取变量的地址,会直接修改原变量
int* a;
(*a) = 100; //解引用赋值
a //内存地址
a = new int; //申请空间
delete a; //delete 释放内存,变为野指针,NULL 为空指针,不指向内存
printf("%p", (void*)a); //打印指针 a 本身存储的地址,void* 只存储一个内存地址,无谓数据类型
int* a;
a = new int [100];
void fun(int* a) {}
fun(a) //传递数组 a 首位地址,会修改原始数组 a
class Node {
private:
int info;
Node* nxt;
};
Node* head;
head->info; //访问成员
(*head).info; //同上,解引用后再访问
void fun(Node* &head){}
fun(head); //会修改原 head
int a;
void fun(int &a){}
fun(a); //会修改原 a
vector
empty(), size() //都是 O(1) 的
begin() //返回迭代器,解引用后是值
void fun(vector<int> g) //线性
void fun(vector<int>& g) //引用和指针都是 O(1) 的,会修改原 g,const 修饰则不许修改
vector<int> gg(g.begin() + 1, g.end()) //拷贝是线性的
vector<int> gg(move(g)) //转移是 O(1) 的,g 变空
priority_queue
priority_queue<int> Q //默认大根堆
priority_queue<node> Q //结构体 node 里可重载 <
priority_queue<int, vector<int>, greater<int>> Q //升序
priority_queue<int, vector<int>, less<int>> Q //降序
实用函数
sort(a + 1, a + n + 1);
int len = unique(a + 1, a + n + 1) - a - 1; //unique返回迭代器末尾
int x = lower_bound(a + 1, a + len + 1, b[i]) - a; // lower_bound 返回迭代器

浙公网安备 33010602011771号