#CPP11. 【Level 1】auto
【Level 1】auto
auto 关键字
现代 C++ 通常是指 C++ 11 及之后的 C++ 版本,因为其对于 C++ 语法进行了大幅度的更新,引入了方便的特性,本文要介绍的 auto
关键字的特性就是其中之一。本文不讨论 auto
同 const
与 &
结合所产生的复杂化学反应,如果有兴趣请自行了解。
定义变量的方式是 类型 变量名
,而如果你使用 auto
则编译器会自动推导变量的类型,如下所示,x
将会被自动推导为 int
类型。
auto x = 5;
我们前面已经知道,引用是在类型的位置加一个 &
,但编译器目前还不够智能,不能自动推断你是否要使用引用,因此你需要手动加上,如下所示
auto x = 5;
auto &r = x;
简化代码
案例1
auto
关键字对于我们目前最大作用是简化代码,例如我们要取一个 vector
首个元素的迭代器(我们将在 STL 部分解释迭代器的作用),需要用对应 vector
类型的迭代器来接受,这样的写法较为麻烦,如下所示
vector<int> vec;
vector<int>::iterator itr;
itr = vec.begin();
这时我们就可以使用 auto
来省去类型
vector<int> vec;
auto itr = vec.begin();
案例2
在前面讲解数组时,我们已经知道可以用 auto
简化 vector
的遍历,让我们回顾一下
vector<int> nums;
for (auto x : nums) {
// do something ...
}
我们可以根据实际需求决定是否使用引用或者 const
。如果我们想要修改 nums
的内容,就必须声明为引用,如下所示
for (auto &x : nums) {
// do something ...
}
有时候我们会看到 const
和 &
一起出现,既然要修改才加引用,但为什么又要加 const
使其不能修改呢?这是因为这里的引用起到的作用是减少拷贝,如果只是要读取 vector
内的元素,你都可以这样做。
for (const auto &x : nums) {
// do something ...
}
案例3
在介绍引用时提到的一个简化 vector
的例子,我们将其简化为
vector<int> &ax = a[i - 2*j +1];
不难发现,可以使用 auto
来进一步简化
auto &ax = a[i - 2*j + 1];
Description
在一次星际旅行中,飞船正在探索一个 n x m
的二维星域矩阵,每个位置表示一个星球的资源储量。飞船从某个星球出发,经过多个星球,根据指令进行移动后采集资源。如果移动指令非法(超出边界),则忽略这条移动指令,在原地再采集一次。
资源采集规则:
- 飞船经过的星球 (i, j) 本身资源会减少 2 个单位
- 对于该星球相邻的 3x3 区域内的其它星球,按照以下规则进行资源变化:
- 如果相邻星球的资源储量大于当前星球的资源储量,增加 1 个单位
- 如果相邻星球的资源储量小于等于当前星球的资源储量,减少 1 个单位
- 资源最多只能减少到 0
- 先移动,后采集资源
Format
Input
第一行两个整数 和 ,表示星域矩阵的行数和列数。
接下来 行,每行包含 个整数,表示每个星球的资源储量。
接下来一行两个整数 ,表示飞船的起始位置。
接下来一行一个整数 ,表示飞船的运动步数。
接下来 行,每行表示飞船的一个移动方向,方向由字符 U(上)、D(下)、L(左)、R(右)
中的一个表示。
Output
输出一个 n x m
的矩阵,表示经过资源采集操作后的资源储量矩阵。
Samples
3 3
5 5 5
5 5 5
5 5 5
2 2
4
U
L
D
R
6 7 7
7 2 0
7 4 6
3 3
5 5 5
5 5 5
5 5 5
0 0
4
U
L
D
R
0 9 4
4 6 4
3 3 4
Related
In following contests: