Я гарантированно инициализирую вектор структуры с каждым элементом, инициализированным нулем с помощью этого кода?

#include <vector>

struct A {
    int a, b;
    float f;
};

int main()
{
    // 100 A's initialized to zero (a=0, b=0, f=0.0)
    // std::vector<A> my_vector(100, {}); does not compile
    std::vector<A> my_vector(100, A{});
}
c++
0
rafoo 19 Янв 2022 в 08:01
1
Что вы подразумеваете под "не работает"? В чем проблема с кодом у вас есть? A{} – это инициализация значения, которая для такого класса, как ваш, должна вести на нулевую инициализацию (где все элементы установлены на "ноль").
 – 
Some programmer dude
19 Янв 2022 в 08:05
Я отредактировал код для уточнения
 – 
rafoo
19 Янв 2022 в 08:07
Я видел много вопросов относительно вектора встроенных, но не векторов структур, просто чтобы быть уверенным
 – 
rafoo
19 Янв 2022 в 08:09
1
std::vector<A> my_vector(100, {{}}); будет скомпилирован. Но ваш код на пару строк выше вызовет синтаксическую ошибку.
 – 
273K
19 Янв 2022 в 08:14

4 ответа

Лучший ответ

Да, это гарантировано, так как A{} является инициализацией значения и из < a href="https://en.cppreference.com/w/cpp/language/zero_initialization" rel="nofollow noreferrer">cppreference:

Нулевая инициализация выполняется в следующих ситуациях:

  • Как часть последовательности инициализации значения для типов, не являющихся классами, и для членов типов классов, инициализированных значением, у которых нет конструкторов, включая инициализацию значений элементов агрегатов, для которых не предоставлены инициализаторы.

Вы также можете использовать:

std::vector<A> my_vector(100, {0,1,1}); 
1
Anoop Rana 19 Янв 2022 в 08:17

Краткий ответ: да

Чтобы узнать, как см. ниже: когда вы пишете

std::vector<A> my_vector(...)

Вы выполняете инициализацию значения, если скобки пусты, или прямая инициализация, если не пусто.

И когда вы пишете A{}, вы выполняете инициализацию списка, что подразумевает инициализацию значения если фигурные скобки пусты, или агрегатная инициализация, если инициализируемый объект является агрегатом .

Так как ваши скобки не пусты, поэтому ниже код

std::vector<A> my_vector(100, A{});

Интерпретируется как

std::vector<A> my_vector(/*created vector of 100 elements */ 100, /* by list  Initialization of struct with default values*/A{});

Поскольку в этом случае A{} пуст, вы выполняете инициализацию значения, которая приводит к zero_initialization< /а> в виде

  1. Как часть последовательности инициализации значения для типов, не являющихся классами, и для членов типов классов, инициализированных значением, у которых нет конструкторов, включая инициализацию значений элементов агрегатов, для которых не предусмотрены инициализаторы.
1
User 19 Янв 2022 в 08:27

Да, у вас гарантированно будет нулевая инициализация с этим кодом

0
kronos 19 Янв 2022 в 08:11
Пожалуйста, рассмотрите возможность размещения такого короткого ответа в качестве комментария к исходному вопросу.
 – 
biqarboy
19 Янв 2022 в 08:32

В приведенном ниже решении объект my_vector инициализируется с использованием переменной a, определенной в типе структуры A.

#include <iostream>
#include <vector>

struct A {
    int a;
    int b;
    float f;
};

int main()
{
    A a = {0, 0, 0.0};
    std::vector<A> my_vector(100, a);
    
    for(A _a : my_vector)
        std::cout << _a.a << " " << _a.b << " " << _a.f << std::endl;
    
    return 0;
}
0
Sercan 19 Янв 2022 в 08:13