C++中数组容器初始化方法

C++中数组容器初始化方法,c++,arrays,c++11,C++,Arrays,C++11,如果我没有正确使用术语,或者我问了一个明显的问题,我道歉。我最近才开始学习C++ 我已经看到,大多数在线示例都使用以下方法初始化数组容器: std::array<int,3> myarray = { 2, 16, 77 }; 但我试着做了以下几点: std::array<int,3> myarray; myarray[0] = 2; myarray[1] = 16; myarray[2] = 77; 似乎也在工作。第一种方法优于第二种方法,还是第二种方法根本不正确?

如果我没有正确使用术语,或者我问了一个明显的问题,我道歉。我最近才开始学习C++

我已经看到,大多数在线示例都使用以下方法初始化数组容器:

std::array<int,3> myarray = { 2, 16, 77 };
但我试着做了以下几点:

std::array<int,3> myarray;

myarray[0] = 2;
myarray[1] = 16;
myarray[2] = 77;

似乎也在工作。第一种方法优于第二种方法,还是第二种方法根本不正确?

两种方法都很好,结果完全相同。但是,首选第一种方法,因为它不仅在代码中更紧凑,而且在运行时更快,因为容器的元素是在构造函数中设置的,而不是在调用构造函数之后设置的。请注意,第一种方法仅在C++11及更高版本中可用。

两种方法都很好,结果完全相同。但是,首选第一种方法,因为它不仅在代码中更紧凑,而且在运行时更快,因为容器的元素是在构造函数中设置的,而不是在调用构造函数之后设置的。请注意,第一个方法仅在C++11及更高版本中可用。

std::array myarray={2,16,77};优势:

更清楚了

myarray从不处于未定义状态。使用std::array myarray;,元素是默认初始化的,这意味着未初始化,因为int的默认初始化是将其保留为未初始化状态。因此,在设置元素值之前读回元素的行为是未定义的

可能更快。编译器可能会将您使用的第二种方法优化为第一种方法

因为C++11,我认为第二种方法是错误的;优势:

更清楚了

myarray从不处于未定义状态。使用std::array myarray;,元素是默认初始化的,这意味着未初始化,因为int的默认初始化是将其保留为未初始化状态。因此,在设置元素值之前读回元素的行为是未定义的

可能更快。编译器可能会将您使用的第二种方法优化为第一种方法


从C++11开始,我认为第二种方法是错误的。

正如你所说的,似乎也在起作用。这通常是一个很好的迹象,表明这两种方法都很好。如果您预先知道所有元素,并且它们是常量,则通常使用第一个元素。如果需要以某种方式计算元素,则通常使用第二种方法。请务必注意,在进行赋值之前,不应访问这些值,因为它们将是未定义的。数组容器的大小是常量,但元素不是。您可以随时更改它们。

正如您所说,似乎也在起作用。这通常是一个很好的迹象,表明这两种方法都很好。如果您预先知道所有元素,并且它们是常量,则通常使用第一个元素。如果需要以某种方式计算元素,则通常使用第二种方法。请务必注意,在进行赋值之前,不应访问这些值,因为它们将是未定义的。数组容器的大小是常量,但元素不是。您可以随时更改它们。

两者都是正确的,首选方法取决于您的需求。两者都是正确的,首选方法取决于您的需求。我知道第一种方法称为聚合初始化,你知道第二种方法叫什么吗?@user-Pecking而不是touch-typing可能是对的:但说真的,它没有专门的名字,因为它没有什么特别的。您只是将值单独指定给元素,覆盖先前的值(如果有)。您可以肯定地初始化变量,这本身就很好,但我认为它没有真正的名称。它通常不属于现代C++代码,所以如果你想命名它,那么不应该做的事情比这肯定是一个务实的方式去做:有无限量的方式编写非惯用代码,这将是可行的。我明白第一个叫做聚合初始化,你知道第二种方法叫什么吗?@user-Pecking而不是touch-typing可能是对的:但说真的,它没有专门的名字,因为它没有什么特别的。您只是将值单独指定给元素,覆盖先前的值(如果有)。您可以肯定地初始化变量,这本身就很好,但我认为它没有真正的名称。它通常不属于现代C++代码,所以如果你想命名它,那么不应该做的事情比这肯定是一个务实的方式去做:有无限量的方式编写非惯用代码,将工作正常。