C++ 语法基础 Ⅱ 与 STL 入门
by AtomFirst
南京航空航天大学
2024-10-12
引论
解决问题的两个步骤
- Thinking: Problem -> Solution
- Coding: Solution -> Code
这节课我们解决 Coding
的问题
怎么学 Coding
- 得到最基本的
knowledge
(在这节课及上节课中学习 C++ 语法) - 进行有质量的
practice
(在 OJ 上提交你的代码) - 现有
knowledge
不足后,进行新的knowledge-practice 循环
(从书本、网课或者线上教程中学习新知识,然后在 OJ 上进行练习)
TIP
听课不能直接提高你的编程能力,只能给你关于编程的知识。只有通过练习才能提高你的编程能力
最小完备程序
图灵完备
- 指可解决一切可计算问题
- 算法问题是可计算问题
- 所以图灵完备的语言可解决一切可计算问题
- 我们将在这一节建立一个完备的内部体系,理论上有能力实现一切可能的
Coding
(但是实际中不够方便,需要改进)
数据 + 运算
程序可以分为数据和对数据的运算
int类型的变量
所有的数据在程序中都可以用整数表示
在 C++ 中用 int
表示整数类型
int a=5; // 声明了一个int类型的变量,并赋值为5
TIP
变量是一个盒子,可以往里面放东西
int 的基本运算
可以对两个 int
类型的变量进行加减乘除和取模(求余数)
#include<iostream>
using namespace std;
int main(){
int a=3,b=5;
int c=a+b;
// int c=a-b;
// int c=a*b;
// int c=a/b;
// int c=a%b;
return 0;
}
TIP
加法 +
、减法 -
、乘法 *
、除法 /
和取模 %
是最基本的运算符
内部与外部
- 内部:程序核心逻辑
- 外部:调用与世界互动的接口
输入输出
虽然我们对 a
和 b
进行了运算,却不知道结果是什么,因为结果存储在内部
通过 cout<<
输出,可以把内部的结果展示到外部
#include<iostream>
using namespace std;
int main(){
int a=3,b=5;
// cin>>a>>b;
int c=a+b;
cout<<c;
return 0;
}
TIP
cin
用于从外部输入数据,cout
用于向外部输出数据
分支结构
如果条件不同,则用不同方式处理
#include<iostream>
using namespace std;
int main() {
int x;
cin>>x;
if(x>0){
cout<<1;
}else{
cout<<0;
}
return 0;
}
TIP
if
语句用于判断条件是否成立,else
语句用于处理条件不成立的情况
循环结构
让程序做多次相似的工作
#include<iostream>
using namespace std;
int main(){
int x=0;
while(x<5){
cout<<x<<" ";
x=x+1;
}
return 0;
}
TIP
while
循环会在条件成立时重复执行代码块
一维数组
可以存储一列数据
#include<iostream>
using namespace std;
int main(){
int a[5];
for(int i=0;i<5;i++)
cin>>a[i];
for(int i=4;i>=0;i--)
cout<<a[i];
return 0;
}
TIP
数组通过下标访问,下标从0开始
这意味着数组的长度为 n
,下标范围是 0
到 n-1
函数与递归
代码复用
不用写多次相同的代码
#include<iostream>
using namespace std;
void say_hello(string name){
cout<<"Hello,"<<name<<"!\n";
}
int main(){
say_hello("cafebabe");
say_hello("c10uds");
return 0;
}
引用与 swap
本质是一个别名
#include<iostream>
using namespace std;
void swap(int &a,int &b){
int t=a;
a=b; b=t;
}
int main(){
int x=3,y=5;
swap(x,y);
cout<<x<<" "<<y;
return 0;
}
为什么建议初学者使用引用而不是指针
引用可以看成是 C++ 封装的指针,用来传递它所指向的对象。在 C++ 代码中实际上会经常和引用打交道,但是通常不会显式地表现出来。引用的基本原则是在声明时必须指向对象,以及对引用的一切操作都相当于对原对象操作。另外,引用不是对象,因此不存在引用的数组、无法获取引用的指针,也不存在引用的引用。
左值引用最常用的地方是函数参数,通过左值引用传参可以起到与通过指针传参相同的效果。
注意引用类型不属于对象类型,所以才需要 reference_wrapper 这种特殊的包装器。
引用主要分为两种,左值引用和右值引用。此外还有两种特殊的引用:转发引用和垂悬引用,不作详细介绍。
递归
调用自己
#include<iostream>
using namespace std;
void print(int x){
if(x/1000)
print(x/1000);
cout<<"_"<<x%1000;
}
int main(){
print(1145141919);
return 0;
}
def print(x):
if x//1000:
print(x//1000)
print("_"+str(x%1000),end="")
print(1145141919)
STL 入门
container
& algorithm
container
: 存储多个数据,可以遍历algorithm
: 对多个数据进行操作
set
是一种 container
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int>st{1,1,4,5,1,4};
st.insert(19);
st.erase(19);
st.insert(810);
cout<<st.count(1)<<"\n";
for(auto x:st)
cout<<x<<" ";
return 0;
}
TIP
set
是一种 container
,它的作用是存储数据,且数据不重复
sort
是一种 algorithm
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int>a{1,1,4,5,1,4,1,9,19,810};
sort(a.begin(),a.end());
for(auto &x:a)
x*=10;
for(auto x:a)
cout<<x<<" ";
return 0;
}
TIP
sort
是一个 algorithm
,它的作用是对 container
中的数据进行排序
听完课你应该做的事
- 听课不能直接提高你的编程能力,只能给你关于编程的知识。只有通过练习才能提高你的编程能力
- 每天安排一定的时间(建议一小时以上),进行本门课对应的练习(入门1 到 入门6)
- 遇到问题尝试通过搜索、题解解决,如果自己不能解决可以在招新群中求助同学或学长