2062 字
10 分钟
L1-001~L1-005的笔记
Samera2022
/
GPLTNotes
Waiting for api.github.com...
00K
0K
0K
Waiting...

P.S. 这份笔记同步发布在我的博客上,建议在博客中查看以享受完整的MD Extended Features. 你可以点此快速跳转到相应页面,我的博客地址为https://samera2022.github.io

L1-001#

代码部分#

L1-001.cpp
#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++输入输出流(如cincout)和C标准库的输入输出函数(如scanfprintf)的同步状态,这会加快输入输出速度,代价是不能再混合使用cinscanf 以及 coutprintf,因为他们执行的顺序是不同步的。在这种情况下,建议只使用cin和cout。
  • cin.tie(nullptr)会取消cincout的绑定,进而使用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#

代码部分#

L1-002.cpp
#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#

代码部分#

L1-003.cpp
#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之外),传入参数时需要使用值传递;对于引用类型,传入参数时需要使用引用传递。如果你的方法本身就需要修改原来变量的值,请继续使用引用传递。如果你的方法本身就希望修改值,但不希望修改原来变量,请继续使用值传递。
  • 另记:常用的基础类型:bool char short int long(←不建议使用) long long float(←不建议使用) double long double。除了long double,其他所有的基础类型大小都小于等于8字节。
  • 另记:特别地,long在Windows中为4字节,在Linux中为8字节,因此请不要使用long,改用long long(全平台均为8字节)更加稳妥。
  • s.at(i)-'0'是C++中charint的方式。不要采用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#

代码部分#

L1-004.cpp
#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#

代码部分#

L1-005.cpp
#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/
作者
Samera2022
发布于
2026-01-21
许可协议
CC BY-NC-SA 4.0