2017-02-20 27 views
0

Если у меня есть конструктор список инициализации, как, например:Понимание вектора инициализации в C++

std::vector<int> _list; 

Program::Program() : _list(0) 
{ 
} 

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

+0

Ваш вопрос трудно понять. Вектор, который вы опубликовали, не имеет записей - вектор просто не изменяет размер самостоятельно. Для этого вам нужно вызвать одну из функций вектора, например 'push_back',' insert', 'emplace_back',' resize'. Когда вы вызываете эти функции, вы управляете тем, что помещается в вектор. – PaulMcKenzie

+4

SInce ведущее подчеркивание - это соглашение, используемое для пользовательских идентификаторов реализации в глобальном пространстве имен, обычно его избегают для собственных идентификаторов. Общим соглашением для переменных-членов является тот, который используется в библиотеке Boost с завершающим подчеркиванием. –

+0

Просьба уточнить вопрос. –

ответ

1

Вы, кажется, неправильно понимаете аргумент конструктора векторов, который вы вызываете. _list(0) будет инициализировать _list до нулевой длины, используя значение по умолчанию для типа int, которое также оказывается равным нулю, но которое не имеет значения, если вектор не содержит никаких элементов. Он явно не устанавливает значение значений в ноль. Возможно, вы хотели, чтобы конструктор повторял одно значение определенное количество раз? Если это так, вам нужно передать нужную длину в качестве первого аргумента, а значение повторить для второго аргумента. Эта конструкция не влияет на последующее изменение размера для расширения вектора, который будет заполнять новые векторные элементы значением по умолчанию (или другим значением, если вы укажете один в качестве дополнительного аргумента для vector::resize).

Ниже приведен пример, чтобы проиллюстрировать, основанный на коде, который сначала инициализирует вектор со значением 10 повторяющейся для длины 5, а затем изменяет размер вектора до длины 10.

#include <iostream> 
#include <vector> 

class Program 
{ 
public: 
    Program() : _list(0) { } 
    Program(unsigned long size, int value) : _list(size, value) { } 

    void ResizeList(unsigned long size) 
    { 
     _list.resize(size); 
    } 

    void PrintList() const 
    { 
     std::cout << "_list = "; 
     for (const auto& val : _list) 
     { 
      std::cout << val << ", "; 
     } 
     std::cout << std::endl; 
    } 

private: 
    std::vector<int> _list; 
}; 

int main() 
{ 
    Program p(5, 10); 
    p.PrintList(); 

    p.ResizeList(10); 
    p.PrintList(); 

    return 0; 
} 

Выход:

_list = 10, 10, 10, 10, 10, 
_list = 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 
+0

Таким образом, вам действительно не нужно инициализировать его вообще если вы просто используете его в качестве списка, верно? Просто push_back пунктов, и вы хороши? – Koszuta

+0

Если вы хотите, чтобы он начинался пустым, то это точно.Пустое - это поведение по умолчанию, если вы не указали никакой другой инициализации (это означает, что вы опустите его из списка инициализатора члена в конструкторе класса, который его владеет), а затем вы можете добавить нужные значения с помощью 'push_back'. –

+0

И если я использую изменение размера на векторе, добавленные элементы будут 0? – Koszuta

0

Если вы посмотрите на the documentation for the std::vector constructor, вы увидите, что для конструктора (3), тот, который вы используете, вы увидите, что вы построение 0 элементов типа int на месте в _list. Это означает, что вы практически ничего не делаете.

При изменении размера вектора элементы, для которых выделено пространство, будут неинициализированы, если вы не используете функцию resize, и в этом случае элементы будут инициализированы значением по умолчанию или значением по вашему выбору.

Например, если вектор были пусты, и вы сделали _list.resize(10);, _list теперь будет содержать 10 элементов типа по умолчанию, возведенных из int, что должно быть просто 0. Если вы вместо этого сделали что-то вроде _list.resize(10, 5);, то _list теперь будет содержать 10 5 s.

Я надеюсь, что это помогло вам разобраться. Если у вас есть какие-либо последующие вопросы, не стесняйтесь спрашивать.

 Смежные вопросы

  • Нет связанных вопросов^_^