退役总结(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)表示真\(/\)假。

__int128long 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 相当于一个只有 publicclass

模板: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++;//不能修改
}
*/
posted @ 2022-12-03 15:19  panyanppyy  阅读(22)  评论(0)    收藏  举报