Forma correcta de inicializar std::vector miembro de datos

3 minutos de lectura

avatar de usuario de q0987
q0987

// Method One
class ClassName
{
public:
    ClassName() : m_vecInts() {}
    
private:
    std::vector<int> m_vecInts;
};
// Method Two
class ClassName
{
public:
    ClassName() {} // do nothing
    
private:
    std::vector<int> m_vecInts;
};

¿Cuál es la forma correcta de inicializar el std::vector miembro de datos de la clase? ¿Tenemos que inicializarlo en absoluto?

  • No, no a menos que desee especificar una capacidad inicial (o inicializar su contenido, lo que puede hacer con listas de inicializadores en C++ 11 o boost’s) list_of I pensar).

    – hmjd

    30 de julio de 2012 a las 16:18


  • El vector de ambas vías se construye utilizando el constructor predeterminado, pero se prefiere el primero

    – Sr. Anubis

    30 de julio de 2012 a las 16:18

  • Si no lo menciona en absoluto en su lista de inicializadores, se llamará al constructor predeterminado. De lo contrario, llame al constructor que sea apropiado (por ejemplo, tal vez desee que tenga 100 elementos construidos predeterminados).

    – Bobtfish

    30 de julio de 2012 a las 16:19

Avatar de usuario de Zeta
zeta

Ver http://en.cppreference.com/w/cpp/language/default_initialization

La inicialización predeterminada se realiza en tres situaciones:

  1. cuando una variable con duración de almacenamiento automático se declara sin inicializador
  2. cuando un objeto con duración de almacenamiento dinámico es creado por una nueva expresión sin un inicializador
  3. cuando una clase base o un el miembro de datos no estáticos no se menciona en una lista de inicializadores de constructor y ese constructor se llama.

Los efectos de la inicialización predeterminada son:

  • Si T es un tipo de clase, se llama al constructor predeterminado para proporcionar el valor inicial para el nuevo objeto.
  • Si T es un tipo de matriz, cada elemento de la matriz se inicializa por defecto.
  • De lo contrario, no se hace nada.

Desde std::vector es un tipo de clase se llama su constructor predeterminado. Por lo tanto, la inicialización manual no es necesaria.

  • me sorprende que class T2 { int mem; public: T2() {} // "mem" not in initializer list }; const T2 t2; // ok, calls the user-provided default ctor // t2.mem is default-initialized

    – q0987

    30 de julio de 2012 a las 16:40

  • Acabo de probar el código anterior en VS2010 y está INCORRECTO. ¡el t2.mem NO está inicializado por defecto!

    – q0987

    30 de julio de 2012 a las 16:52

  • @q0987: mem es un int, no es ni una clase ni un tipo de matriz, por lo que no se inicializará de manera predeterminada. El código provisto en cppreference casi siempre se verifica bajo el estándar C++11, pero no sé si esto cambia algo para el caso dado (dado el const Calificatorio). Sin embargo, incluso si el ejemplo es inconsistente e incluso incorrecto, la explicación y el estándar en sí no lo son.

    – Zeta

    30 de julio de 2012 a las 16:54


Eso depende. Si desea un vector de tamaño 0, entonces no tiene que hacer nada. Si desea, por ejemplo, un relleno vectorial de tamaño N de 42 s, utilice las listas de inicializadores del constructor:

ClassName() : m_vecInts(N, 42) {}

avatar de usuario de mrts
señora

Desde C ++ 11, también puede usar inicialización de lista de un miembro no estático directamente dentro de la declaración de clase:

class ClassName
{
public:
    ClassName() {}

private:
    std::vector<int> m_vecInts {1, 2, 3}; // or = {1, 2, 3}
}

  • ¿Existe una sintaxis alternativa que pueda ayudar cuando el tamaño del vector es muy grande, por ejemplo, cuando quiero un vector de 40 elementos, todos inicializados en 100?

    – sancho.s ReincorporarMonicaCellio

    29 abr 2021 a las 23:49

  • @sancho.sReinstateMonicaCellio std::vector<int> m_vecInts = std::vector<int>(40, 100); trabajará.

    – Hari

    9 de agosto de 2022 a las 6:47


No tiene que inicializarlo explícitamente, se creará cuando cree una instancia de su clase.

¿Ha sido útil esta solución?