2062 字
10 分钟
L1-001~L1-005的笔记
Waiting for api.github.com...
P.S. 这份笔记同步发布在我的博客上,建议在博客中查看以享受完整的MD Extended Features. 你可以点此快速跳转到相应页面,我的博客地址为https://samera2022.github.io
L1-001
代码部分
#include <bits/stdc++.h>using namespace std;typedef long long ll;
int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cout << "Hello World!"; return 0;}笔记部分
#include <bits/stdc++.h>using namespace std;typedef long long ll;#include属于预处理语句,在编译期会对这些语句进行复制操作。即,将目标文件的内容原封不动地剪切到本文件的这一行。第一句为导入bits/stdc++.h这个头文件,该头文件包含大量常用的#include语句,因此又被称为“万用头”。using namespace是使用命名空间,在C++中这是为了解决命名冲突而诞生的,在Java中该操作类似于static import的效果。未使用std命名空间时,所有试图调用std的操作都需要通过std::xxx来实现,而使用后则可直接操作。typedef是起别名,在此例中是将long long全部改名为ll,这使得你的输入更加方便。- 另记:C++中int的范围和Java中int的范围一致;
long long的范围和Java中long的范围一致。
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);ios::sync_with_stdio(false);是关闭C++输入输出流(如cin和cout)和C标准库的输入输出函数(如scanf和printf)的同步状态,这会加快输入输出速度,代价是不能再混合使用cin和scanf以及cout和printf,因为他们执行的顺序是不同步的。在这种情况下,建议只使用cin和cout。cin.tie(nullptr)会取消cin与cout的绑定,进而使用cin时不再会强制刷新cout的缓冲区,进而加快输入输出速度。cout.tie(nullptr)其实没有什么用,写上这一句大多数出于心理安慰,或者避免极少数情况下cout被意外绑定到其他输出流。- 另记:有人认为
nullptr空指针是AI才会写的形式,进而推荐直接写0进去。我对此持保留意见,后面的代码仍然会沿用nullptr的写法。
cout << "Hello World!"; return 0;- 用于
cout的<<是一个新的符号,可以认为将右侧的内容推送到左端去,同理用于cin的>>是将左侧的内容推送到右端去。二者属于流插入运算符,是通过重载位左/右移运算符实现的。 return 0中的0是退出状态码,也就是你在IDE下方控制台在最后经常看到的“进程已结束,退出代码为 0”的那个0。在main函数中其实可以省略,因为省略之后编译器会默认采用return 0。对于在线评测系统而言,通常要求返回值必须为0,这导致你在main中写不写返回其实没有影响。- 另记:“补全
return 0”的操作编译器只会在main函数,即你的入口函数(int main)进行。对于其他的非void的函数,你仍然需要手动写出所有的返回语句。
这份代码基本是以后所有代码的模板。即,之后的代码基本都会以这样的形式给出。
L1-002
代码部分
#include <bits/stdc++.h>using namespace std;typedef long long ll;
void solve(int N, char style);
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int N; cin >> N; char style; cin>>style; solve(N, style); return 0;}
void solve(const int N, const char style) { const int time = static_cast<int>(pow(((N + 1) / 2), 0.5)); const int rest = N - (2 * time * time - 1); const int max = 2 * time - 1; for (int i = 1; i <= time; i++) { for (int k = 0; k < i - 1; k++) cout << " "; for (int j = 1; j <= max - 2 * (i - 1); j++) cout << style; cout << "\n"; } for (int i = 2; i <= time; i++) { for (int k = 0; k < time - i; k++) cout << " "; for (int j = 1; j <= 2 * i - 1; j++) cout << style; cout << "\n"; } cout << rest;}笔记部分
- C++相较于Java有一点比较独特,如果调用的方法写在下方的话,则需要在在上方先写一个声明以供链接。因此也有不少人选择将
solve方法写在main函数的上面。 - C++对于只有单语句的循环也可以省略大括号,这一点在Java中是没有的。
- 我对于所有的常量都加
const修饰了,这可能会对C++比较熟练的人造成疑惑。这其实只是我为了不想看见编译器中的黄色弱警告干的)))我知道这种写法比较抽象,可能类似于IDEA中把每一个提示警告的全局的变量都上了一个final修饰一样生草,我也知道可以通过修改编译器显示警告的方案来取消显示这些警告,但是我还是觉得这么写会好一些))) - 有的人换行可能会采用
endl,不过我还是沿用Java的"\n"。前者会刷新输出缓冲区而后者不会,因此后者的效率也会更高一些。
L1-003
代码部分
#include <bits/stdc++.h>using namespace std;typedef long long ll;
void solve(const string& s);
int cnt[10];
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); string s; cin >> s; solve(s); return 0;}
void solve(const string& s) { int len = static_cast<int>(s.length()); for (int i = 0; i < len; i++) { cnt[s.at(i)-'0']++; } for (int i = 0; i < 10; i++) { if (cnt[i]!=0) cout<<i<<":"<<cnt[i]<<"\n"; }}笔记部分
int cnt[10]是C++数组的写法。在开启编译器优化时,读取和写入操作vector(C++的列表)能做到和它一样快。- 另记:C++中的数组在局部可变长度,即,你可以在局部声明一个
int N填入int cnt[]中,zecnt长度会随N的变化而改变。特别地,在全局你只能声明确定长度的数组。 - 这里用到了引用
&,Java中的参数传递只有值传递,而C++中可以做到引用传递。在方法的参数列表中,在变量名旁边加&即认为是传递引用。特别地,如果传递的是引用,则需要在最上方声明时同样改为引用传递。 - 指针的大小为8字节,因此在
可以选择值/引用传递时,对于基础类型(除long double之外),传入参数时需要使用值传递;对于引用类型,传入参数时需要使用引用传递。如果你的方法本身就需要修改原来变量的值,请继续使用引用传递。如果你的方法本身就希望修改值,但不希望修改原来变量,请继续使用值传递。 - 另记:常用的基础类型:
boolcharshortintlong(←不建议使用)long longfloat(←不建议使用)doublelong double。除了long double,其他所有的基础类型大小都小于等于8字节。 - 另记:特别地,
long在Windows中为4字节,在Linux中为8字节,因此请不要使用long,改用long long(全平台均为8字节)更加稳妥。 s.at(i)-'0'是C++中char转int的方式。不要采用stoi(to_string(s.at(i)))!因为C++中的char类型本身即可作为int,这会输出它们的ASCII码。这使得后者输出的即为ASCII,而前者通过减去基准的’0’获得的相对偏移量才是数字本身。- 另记:特别地,Java中的char为2字节(UTF-16),而C++中的char为1字节(Unicode),其本质为8位整数,因而C++中的
char类型才可以本身即可作为int输出。
L1-004
代码部分
#include <bits/stdc++.h>using namespace std;typedef long long ll;
void solve(int F);
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int F; cin>>F; solve(F); return 0;}
void solve(const int F) { cout<<"Celsius = "<<5*(F-32)/9;}笔记部分
- 没有什么好记的。
L1-005
代码部分
#include <bits/stdc++.h>using namespace std;typedef long long ll;
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int total; cin>>total; string arr[total+1];//开大一位,方便后面查询 for (int i = 0; i < total; i++) { string s; cin>>s; int seat1; cin>>seat1; int seat2; cin>>seat2; arr[seat1] = s + " " + to_string(seat2); } int ask_total; cin>>ask_total; for (int i = 0; i < ask_total; i++) { int j; cin>>j; cout<<arr[j]<<"\n"; } return 0;}笔记部分
- 没有什么好记录的,此处
string[]开大一位是因为后面出现了越界,而在这里多开一位是修改量最小的方法。
L1-001~L1-005的笔记
https://samera2022.github.io/posts/Notes/GPLT/l1-001l1-005/