跳到主要内容

固定大小数组

在本课程中,我们将简要解释什么是 std::array。在本课程的后面,您将了解更多。

动机

我们已经有了向量,它们表示动态数组,我们可以用它们来存储任意数量的元素。您可能会问

为什么我们甚至需要固定大小的数组?

简短的回答是:性能

arrayvector 与 C 风格数组

std::arraystd::vector 的一个性能更高的替代品,但有一些限制。它也是 C 风格数组的一个更安全的替代品。

我们,本课程的创建者,充分意识到对于初学者来说,与 vector 相比微小的性能提升不值得额外的努力。此容器将在稍后更深入地介绍,届时您将更熟悉 C++。

使用 std::array

我们要做的第一件事是包含 <array> 头文件

#include <array>

创建数组

相当多的方法可以创建 std::array 的实例。请记住:我们正在讨论一个固定大小的数组,我们必须事先知道它的大小。创建数组后,我们无法更改其大小。一种常见的做法是估计我们将使用的最大元素数量,然后创建该大小的数组。

我们的游戏最多允许 10 个玩家
std::array<std::string, 10> player_names;

在上一课中,我们使用类似的表示法来创建 vector 实例。这次我们必须同时提供

  • 元素的类型 (Type)
  • 数组的大小 (N)

我们通过用逗号分隔它们来实现

// prism-push-types:Type
std::array<Type, N>

用一些预定义的值初始化数组是很常见的。我们可以通过使用花括号语法来实现

最多允许 10 个玩家,提供三个初始名称
std::array<std::string, 10> player_names = {
"HappyBanana", "AngryCrab", "SadWolf",
};
替代语法

您可以省略 player_names 和花括号之间的 =,然后将元素列表封装在额外的 {} 中以达到相同的效果

std::array<std::string, 10> player_names {{
"HappyBanana", "AngryCrab", "SadWolf",
}};
我们留在 { } 中未设置的元素

如果您不为所有元素提供初始值,其余元素将使用默认值或零值进行初始化。简单来说,根据数组内部的类型:数值将设置为 0,布尔值将设置为 false,字符串将为空。

这是前一个代码片段后数组的内容

索引
0"HappyBanana"
1"AngryCrab"
2"SadWolf"
3
......
9

访问元素

我们可以以与向量相同的方式访问数组的元素

显示第一个玩家的名字
#include <iostream>
#include <string>
#include <array>

int main()
{
std::array< std::string, 10 > player_names = {
"HappyBanana", "AngryCrab", "SadWolf"
};

// Setting names of the players
player_names[0] = "SadBanana";
player_names[2] = "HappyWolf";

// Printing the name of the first player:
std::cout << "Name of the first player: " << player_names[0];
}

我们更改了数组的第一个和第三个元素。程序的输出是

Name of the first player: SadBanana

这是前一个代码片段后数组的内容

索引
0"SadBanana"
1"AngryCrab"
2"HappyWolf"
3
......
9

读取数组的大小

我们可以使用 size() 方法来获取数组的大小

std::array<std::string, 10> player_names = {
"HappyBanana", "AngryCrab", "SadWolf",
};

std::cout << "Number of players: " << player_names.size();

程序的输出是

Number of players: 10
std::array 的大小

正如您从上面的示例中看到的那样,无论我们手动设置了多少元素,数组的所有“插槽”都被使用。其余的都用默认值初始化,在本例中是空字符串。

显示元素

就像我们对向量所做的那样,我们可以使用 for 循环来显示数组的所有元素

显示所有玩家姓名
for (std::string name : player_names)
{
std::cout << "Player: " << name << '\n';
}
查看完整代码
显示所有玩家姓名
#include <iostream>
#include <string>
#include <array>

int main()
{
std::array< std::string, 10 > player_names = {
"HappyBanana", "AngryCrab", "SadWolf"
};

// Printing all player names
for (std::string name : player_names)
{
std::cout << name << '\n';
}
}

程序的输出是

Player: HappyBanana
Player: AngryCrab
Player: SadWolf
Player:
Player:
Player:
Player:
Player:
Player:
Player:

总结

总而言之,我们已经了解到 C++ 中有一个名为 std::array 的固定大小数组。在许多情况下,我们可以像使用 vector 一样使用它,但它有一些限制,并且不如 vector 灵活。我们建议您目前还是坚持使用 std::vector

我们暂时就讲到这里,但稍后会在课程中再回来讨论它。

固定大小数组

在本课程中,我们将简要解释什么是 std::array。在本课程的后面,您将了解更多。

动机

我们已经有了向量,它们表示动态数组,我们可以用它们来存储任意数量的元素。您可能会问

为什么我们甚至需要固定大小的数组?

简短的回答是:性能

arrayvector 与 C 风格数组

std::arraystd::vector 的一个性能更高的替代品,但有一些限制。它也是 C 风格数组的一个更安全的替代品。

我们,本课程的创建者,充分意识到对于初学者来说,与 vector 相比微小的性能提升不值得额外的努力。此容器将在稍后更深入地介绍,届时您将更熟悉 C++。

使用 std::array

我们要做的第一件事是包含 <array> 头文件

#include <array>

创建数组

相当多的方法可以创建 std::array 的实例。请记住:我们正在讨论一个固定大小的数组,我们必须事先知道它的大小。创建数组后,我们无法更改其大小。一种常见的做法是估计我们将使用的最大元素数量,然后创建该大小的数组。

我们的游戏最多允许 10 个玩家
std::array<std::string, 10> player_names;

在上一课中,我们使用类似的表示法来创建 vector 实例。这次我们必须同时提供

  • 元素的类型 (Type)
  • 数组的大小 (N)

我们通过用逗号分隔它们来实现

// prism-push-types:Type
std::array<Type, N>

用一些预定义的值初始化数组是很常见的。我们可以通过使用花括号语法来实现

最多允许 10 个玩家,提供三个初始名称
std::array<std::string, 10> player_names = {
"HappyBanana", "AngryCrab", "SadWolf",
};
替代语法

您可以省略 player_names 和花括号之间的 =,然后将元素列表封装在额外的 {} 中以达到相同的效果

std::array<std::string, 10> player_names {{
"HappyBanana", "AngryCrab", "SadWolf",
}};
我们留在 { } 中未设置的元素

如果您不为所有元素提供初始值,其余元素将使用默认值或零值进行初始化。简单来说,根据数组内部的类型:数值将设置为 0,布尔值将设置为 false,字符串将为空。

这是前一个代码片段后数组的内容

索引
0"HappyBanana"
1"AngryCrab"
2"SadWolf"
3
......
9

访问元素

我们可以以与向量相同的方式访问数组的元素

显示第一个玩家的名字
#include <iostream>
#include <string>
#include <array>

int main()
{
std::array< std::string, 10 > player_names = {
"HappyBanana", "AngryCrab", "SadWolf"
};

// Setting names of the players
player_names[0] = "SadBanana";
player_names[2] = "HappyWolf";

// Printing the name of the first player:
std::cout << "Name of the first player: " << player_names[0];
}

我们更改了数组的第一个和第三个元素。程序的输出是

Name of the first player: SadBanana

这是前一个代码片段后数组的内容

索引
0"SadBanana"
1"AngryCrab"
2"HappyWolf"
3
......
9

读取数组的大小

我们可以使用 size() 方法来获取数组的大小

std::array<std::string, 10> player_names = {
"HappyBanana", "AngryCrab", "SadWolf",
};

std::cout << "Number of players: " << player_names.size();

程序的输出是

Number of players: 10
std::array 的大小

正如您从上面的示例中看到的那样,无论我们手动设置了多少元素,数组的所有“插槽”都被使用。其余的都用默认值初始化,在本例中是空字符串。

显示元素

就像我们对向量所做的那样,我们可以使用 for 循环来显示数组的所有元素

显示所有玩家姓名
for (std::string name : player_names)
{
std::cout << "Player: " << name << '\n';
}
查看完整代码
显示所有玩家姓名
#include <iostream>
#include <string>
#include <array>

int main()
{
std::array< std::string, 10 > player_names = {
"HappyBanana", "AngryCrab", "SadWolf"
};

// Printing all player names
for (std::string name : player_names)
{
std::cout << name << '\n';
}
}

程序的输出是

Player: HappyBanana
Player: AngryCrab
Player: SadWolf
Player:
Player:
Player:
Player:
Player:
Player:
Player:

总结

总而言之,我们已经了解到 C++ 中有一个名为 std::array 的固定大小数组。在许多情况下,我们可以像使用 vector 一样使用它,但它有一些限制,并且不如 vector 灵活。我们建议您目前还是坚持使用 std::vector

我们暂时就讲到这里,但稍后会在课程中再回来讨论它。