退役总结(1.基础语法)
AFO 所以有空总结一下了。
语言:未定义
就按 NOI 大纲内容写吧。
都是个人理解,不喜勿喷
基础语法
1.基本数据类型(结构)
int,long(int),long long(int) \(32/64\) 字节整形
加上 unsigned/signed 表示无符号\(/\)有符号,默认为有符号。
注: 顺序无所谓(int long unsigned long a)。
(long)double float 浮点数
char 字符
bool 布尔(true/false)表示真\(/\)假。
__int128 比 long long 还大的整形
size_t 内置 unsigned long 类型
const 可以让这个数据结构无法被修改。
int a[x] 可以定义一个大小为 \(x\) 下标从 \(0\sim x-1\) 的类型为 int 的数组。
int* 表示一个地址,地址相当于内存中的一个位置,这里表示一个类型为 int 的数所在的位置。
当然,可以指针套指针(int**f),可以数组套数组(int a[233][233])。
构造函数:可以把函数名当做一个函数,这样可以构造出来一个通过传入初始化数据形成的数据。
有些数据结构有 C++ 定义的构造函数,可以直接调用。
比如 int a(114514);。
class/struct: 就是所谓的结构体。
结构体中可以定义一些数据类型,通过 .(类型),->(指针) 调用如下:
class node{
public:
int a,b=2;//可以初始化
char c;
bool e[10];
struct nd{
unsigned long long f;
}// 可以嵌套
int fuc(int x){return a+x;}
// 可以写成员函数(然后就可以调用 a.fuc(2) 了)
int operator+(int y)const{
return a+y;
}//可以重载运算符(然后就可以调用 (node)a+(int)b了)
}d[100],*c;
d[0].a=1;
cout<<(d[0].a)<<'\n';
c=&d[0];
cout<<(c->a)<<'\n';
public 就是可以在结构体外面修改, private 只能在结构体内修改。
struct 相当于一个只有 public 的 class。
模板:template<> 可对多种不同的数据类型使用(就姑且让我这么说说罢)。
如下是一个更新最大值得函数,相当于 x=max(x,y),用上模板以后就可以对不同的类型使用这个函数了。
template<typename T_>void Max(T_&x,const T&y){
if(y>x)x=y;
}
...
int x=3,y=8;
Max<int>(x,y);
在传参都明确的情况下 <int> 可以省略。
STL
pair<> 是 STL 内置的二元组。
STL 中大部分容器都是不定长的,array<> 等除外。
STL 中的容器如果越界会 RE。
string STL 库中的字符串,类似于 char a[],但是不定长。
vector<> 不定长数组。
定义:vector<int>a;
push_back() 在最后加入一个数。
大多 push,insert 可以用 emplace代替。emplace 代表插入调用构造函数以后的值,如下:
vector<pair<int,int>>a;
a.emplace_back(1,2);
就会在最后插入一个二元组 {1,2}。
pop_back() 可以从末尾删除一个字符。
basic_string<>
string 其实是 basic_string<char>,basic_string<> 是一个类似于数组的不定长容器,还可以用 += 在最后加入一个数相当于 push_back(),用 + 来把两个 basic_string<> 合起来。
2. 基本语句
cin,cout,printf,scanf 用法。
cin>>x>>y 读入,cout<<x<<y 输出,scanf("%?%?",&x,&y) 输入,printf("%?%?",x,y) 输出。
有些类型的读入输出并不被 cin,cout,printf,scanf 兼容。
scanf 的 ? 可以被代替为:
https://zh.cppreference.com/w/cpp/io/c/fscanf
这个我是真的懒了 ^_^。
代码块:用单个 ; 分隔的语句或者 {} 包裹的若干语句。
if 语句
if(条件) 操作1
else 操作2
条件满足 \(\to\) 操作1
否则 \(\to\) 操作2
for/while 语句
while(条件) 操作
顺序 条件 \(\to\) 操作 \(\to\) 条件……
do 操作
while(条件);
顺序 操作 \(\to\) 条件 \(\to\) 操作……
for(初始化;条件;迭代操作) 操作
顺序 初始化 \(\to\) 条件 \(\to\) 操作 \(\to\) 迭代操作 \(\to\) 条件……
当条件不满足时退出循环。
注: if,while,for 操作表示一个代码块。
3.运算
赋值 x=y,使 \(x\) 的值变成 \(y\)。
算数运算 +,-,*,/,%
x/0 会 RE,浮点数 x/0 会返回 inf (0./0 会返回 nan)。
注:inf 有符号
关系运算 >,<,==,!=,>=,<=
位运算 &,|,^,~,<<,>>
逻辑运算 ||,&&,!
||,&& 有短路性(如果前面已经可以确定返回值了就不运算下去了),但是重载后的没有。
三目运算 x?y:z 如果 \(x\) 成立就 \(y\) 否则 \(z\)。
对于二元算数运算和位运算,都有形如 +=,*=,<<=,&= 的赋值操作。
自增自减 x++,++x,x--,--x
前缀表示先自增 \(1/-1\) 并返回。
后缀表示先返回再自增 \(1/-1\)。
可以通过 &a 来获得 \(a\) 的地址。
直接调用数组会返回它的头指针,类似于:int a[10],*b=a;
b+3 表示 \(b\) 指针向后移动 \(3\) 格,相当于 \(a\) 的第 \(3\) 个元素的地址。
b[2] 表示 \(b\) 指针向后移动 \(2\) 格所在位置的值。
*b 表示 \(b\) 指针所在位置上的值。
所以可以发现 *(b+2) 等同于 b[2]。
所以 *(b+2) 等于 2[b]。
注: 如果 int b=a 修改 \(b\) 不会改变 \(a\) 的值,但是如果 int*b=&a 修改 *b 会改变 \(a\) 的值。(可以理解为修改了地址上的值)
4.函数
定义一个函数 int a(int c,int d){return c+d;}
表示一个名为 \(a\) 的函数可以传入两个 int 类型参数然后返回一个 int 类型。
这里函数表示返回传入两个数的和。
lamoda,一个比较方便的定义函数的类型:
auto f=[&](int x,int y)->int{
return x+y;
};
和上面一样,定义了一加法函数 f(int,int)。
这里的 (->int) 可以让编译器自己推出返回值而省略。
[] 里的 & 表示可以修改外面的数。= 表示复制外面的数(改为 const 类型,不能修改)。
int z=1;
auto f=[&](){
z++;
};
f();//可以让 z 全局加一
/*
auto g=[=](){
z++;//不能修改
}
*/

浙公网安备 33010602011771号