Я гарантированно инициализирую вектор структуры с каждым элементом, инициализированным нулем с помощью этого кода?
#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{});
}
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});
Краткий ответ: да
Чтобы узнать, как см. ниже: когда вы пишете
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< /а> в виде
- Как часть последовательности инициализации значения для типов, не являющихся классами, и для членов типов классов, инициализированных значением, у которых нет конструкторов, включая инициализацию значений элементов агрегатов, для которых не предусмотрены инициализаторы.
Да, у вас гарантированно будет нулевая инициализация с этим кодом
В приведенном ниже решении объект 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;
}
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
A{}
– это инициализация значения, которая для такого класса, как ваш, должна вести на нулевую инициализацию (где все элементы установлены на "ноль").std::vector<A> my_vector(100, {{}});
будет скомпилирован. Но ваш код на пару строк выше вызовет синтаксическую ошибку.