Вектор как ученик - PullRequest
       21

Вектор как ученик

3 голосов
/ 18 декабря 2011

Здравствуйте, у меня есть этот вопрос: я хотел бы иметь вектор в качестве члена класса.Возможно, для вас этот вопрос проще, и я прошу прощения за это.

  • как мне объявить вектор?И это правильно?std::vector<int> *myVector; или std::vector<int> myVector?
  • как мне обработать этот вектор в dealloc?
  • Как я могу инициализировать массив в if?
    if(myCondition)
    {
       if(!myVector) //is this correct?
           myVector = new std::vector<int>(); //is this correct? on this i have a error
    }
    

Ответы [ 4 ]

7 голосов
/ 18 декабря 2011

Вы наверняка хотите использовать std::vector<int> myVector. Не нужно его инициализировать, так как он автоматически инициализируется в конструкторе вашего класса и освобождается, когда ваш класс уничтожается.

6 голосов
/ 18 декабря 2011

Просто используйте автоматическое распределение: объявите его как член, подобный следующему:

class YourClass
{
    std::vector<int> myVector;
    // ...
};

Массив создается автоматически перед запуском любого вашего конструктора и уничтожается автоматически, когда ваш объект освобождается,не нужно об этом заботиться (также конструктор копирования по умолчанию и оператор присваивания будут корректно обрабатывать копирование автоматически).

Если вместо этого вы хотите создать массив только после определенного условия, вам придется прибегнуть к(умный) указатель и динамическое выделение, но IMHO, это довольно громоздко (особенно потому, что тогда вам нужно правильно понять «большую тройку» - конструктор копирования, оператор присваивания, деструктор);вместо этого вы можете просто выделить вектор с автоматическим размещением и использовать отдельный флаг, чтобы пометить массив как не инициализированный, или просто проверить, равен ли его размер 0.

0 голосов
/ 18 декабря 2011

В большинстве случаев, когда мы используем стандартную библиотеку, Нам не нужно заботиться о распределении / освобождении памяти . Шаблон будет обрабатывать его автоматически. например. Память std :: vector будет увеличиваться или уменьшаться в соответствии с элементами, хранящимися в этом векторе. Это будет пример .

Следовательно, почти вы можете использовать его таким образом в вашем случае.

std::vector<int> myVector  //your second declaration
if(myCondition)
{
   myVector.push(some_int);  // use it directly
}

Память, в которой использовался вектор, будет освобождена после уничтожения созданного вами объекта Class.

0 голосов
/ 18 декабря 2011

Это полностью зависит от контекста - что означает вектор и зачем он вам нужен.Должно ли оно быть общим для нескольких объектов?Если вы не знаете, не держите указатель, перейдите ко второму варианту.

std::vector<int> myVector;

Если у вас есть веские причины иметь указатель, используйте умный указатель, который обеспечиваетнаиболее подходящее владение для вашей ситуации - shared_ptr, scoped_ptr, unique_ptr или whatever_ptr

...