std::array
和 std::vector
都是C++标准库中的容器,但它们在初始化时的行为有所不同。std::array
是一个固定大小的数组,它在编译时就知道其大小,而 std::vector
是一个动态数组,它可以在运行时改变大小。
std::array
是一个聚合类型,它的初始化需要遵循C++的聚合初始化规则。对于 std::array<std::pair<int, int>, 3>
这样的类型,你不能直接使用嵌套的初始化器列表来进行初始化,因为它不是一个简单的聚合类型。std::array
的内部实现通常是一个固定大小的数组,而不是一个嵌套的聚合。
例如,以下代码是错误的:
std::array<std::pair<int, int>, 3> arr = {{ {1, 2}, {3, 4}, {5, 6} }}; // 错误
正确的初始化方式是分别初始化每个元素:
std::array<std::pair<int, int>, 3> arr = {std::pair<int, int>{1, 2}, std::pair<int, int>{3, 4}, std::pair<int, int>{5, 6}};
或者使用C++11引入的统一初始化语法:
std::array<std::pair<int, int>, 3> arr{{ {1, 2}, {3, 4}, {5, 6} }};
std::vector
是一个动态数组,它可以存储任意类型的元素,并且可以在运行时改变大小。std::vector
提供了多种初始化方式,包括使用初始化器列表。
例如,以下代码是正确的:
std::vector<std::pair<int, int>> vec = {{1, 2}, {3, 4}, {5, 6}};
这是因为 std::vector
的构造函数接受一个初始化器列表作为参数,这使得你可以使用嵌套的初始化器列表来初始化 std::vector
中的元素。
std::array
是一个固定大小的数组,它的初始化需要遵循C++的聚合初始化规则,不能直接使用嵌套的初始化器列表。std::vector
是一个动态数组,它提供了多种初始化方式,包括使用初始化器列表。如果你需要使用嵌套的初始化器列表来初始化一个固定大小的数组,你可以考虑使用 std::array
的构造函数或者统一初始化语法。如果你需要一个可以动态改变大小的数组,你可以使用 std::vector
。