如何声明并内联初始化含不同值的std::array结构体数组
初始化std::array<MyStruct, N>的正确姿势
嘿,这事儿其实挺直接的,和你初始化int类型的std::array逻辑完全一致——只不过每个数组元素要对应MyStruct的四个成员来赋值就行。
首先先确认你的结构体定义没问题:
struct MyStruct { const char *char_val_1; const char *char_val_2; int int_val_1; double d_val_1; };
接下来初始化std::array的话,直接嵌套大括号就能搞定,这里有两种常见的写法,都能正常工作:
写法1:严格嵌套大括号(兼容C++11及更早版本)
因为std::array本质是封装了原生数组的结构体,所以最严谨的写法是保留两层外层大括号,每个MyStruct用一对大括号包裹它的成员:
#include <array> // 初始化包含4个MyStruct元素的数组 std::array<MyStruct, 4> my_arr = { { {"a1b1", "a2b1", 1, 1.1}, {"a1b2", "a3b1", 2, 1.2}, {"a1b3", "a4b1", 3, 1.3}, {"a1b4", "a5b1", 4, 1.4} } };
写法2:简化大括号(C++11及以后可用)
从C++11开始,编译器允许省略最外层的那对大括号,写法更简洁直观:
std::array<MyStruct, 4> my_arr = { {"a1b1", "a2b1", 1, 1.1}, {"a1b2", "a3b1", 2, 1.2}, {"a1b3", "a4b1", 3, 1.3}, {"a1b4", "a5b1", 4, 1.4} };
几个要注意的小细节
- 结构体成员的初始化顺序必须严格匹配结构体定义的顺序,不然会出现类型不匹配或者赋值错乱的问题。
- 你的
MyStruct是POD类型(普通旧数据类型),所以才能用这种聚合初始化的方式;如果结构体自定义了构造函数,就得改用构造函数来初始化每个元素。 - C++17及以后还能进一步简化:省略初始化语句里的
=号,写法更清爽:std::array<MyStruct, 4> my_arr { {"a1b1", "a2b1", 1, 1.1}, {"a1b2", "a3b1", 2, 1.2}, {"a1b3", "a4b1", 3, 1.3}, {"a1b4", "a5b1", 4, 1.4} };
这样写出来的代码完全符合你的需求,和初始化int数组的逻辑一脉相承,只是把每个int元素换成了结构体的聚合初始化而已。
内容的提问来源于stack exchange,提问作者TheWaterProgrammer
相关产品推荐
相关产品推荐

