вектор указателей - PullRequest
       17

вектор указателей

4 голосов
/ 12 октября 2011

Если у меня есть определение в заголовке класса, например:

vector<baddie*> baddies;

, которое я затем инициализирую в конструкторе следующим образом:

Class::Class(vector<baddie*> input)
{
    baddies = input;
}

Что я получу в итоге?Два вектора с двумя наборами указателей, указывающих на объекты?

Было бы лучше просто указать на исходный вектор?Это вообще возможно?

Или было бы лучше сохранить вектор ссылок на указатели в классе, чтобы не дублировать указатели?Какова лучшая практика для доступа к объектам и массивам объектов в нескольких классах?Рекомендации?Указатели?Указатель ссылок?Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 12 октября 2011

Это зависит от семантики, которую вы хотите предоставить. В C ++ 11 вы, вероятно, захотите сделать что-то вроде:

Class::Class( vector<baddie*> input ) : baddies( std::move(input) ) {}

Который переместит память из копии в аргументе члену, тогда как в C ++ 03 вы, вероятно, напишите:

Class::Class( vector<baddie*> const & input ) : baddies( input ) {}

Что инициализирует вектор с копией.

Обратите внимание, что это обсуждение относится только к содержанию вектора, а не к данным, указанным указателями baddie. То есть в обоих случаях будет два вектора с указателями для ссылки на одни и те же элементы (т. Е. Только одна копия каждого baddie в памяти с двумя указателями на него).

В зависимости от семантики вашего приложения, вы можете перейти от этого промежуточного мелкого копирования к любому концу: выполнить глубокое копирование (то есть создать новые элементы baddie в памяти, так что оригинал и копия полностью не связаны после завершения конструктора) или вообще не копируются, и просто сохраните ссылку / указатель так, чтобы оба вектора были в точности одинаковыми (вставка внутри или снаружи класс будет виден снаружи / внутри класса).

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

1 голос
/ 12 октября 2011

Ну, если вы хотите поделиться данными, я бы, вероятно, использовал std::vector< std::shared_ptr<baddie> > или a boost::shared_ptr< boost::ptr_vector<baddie> >

Однако на самом деле это зависит от:

  • ваших намерений
  • если необходимо иметь общие данные
  • , если "baddie" действительно очень дорого построить / скопировать

кроме того: вы должны использовать список инициализатора для инициализации ваших членов:

Class:Class(vector<baddie> input)
: baddies( input ) 
{}
0 голосов
/ 12 октября 2011

Это плохой способ сделать это, потому что сначала он копирует вектор в конструктор, а затем копирует его в вектор, называемый baddies, в этом случае лучше иметь входные данные в качестве ссылки, а затем скопировать их в baddies.Если вы хотите иметь контроль над копией, вы можете рассмотреть обход входного вектора и перенести каждое значение в вектор злоумышленников.Если вы хотите получить большую скорость, вы можете объявить вектор злоумышленников и входной вектор как указатели, а затем просто указать злоумышленникам, откуда взялся входной вектор.Это, однако, делает его немного уродливым, потому что если вы индексируете вектор с помощью [], то сначала вы будете индексировать указатель, так что вам придется индексировать его дважды, чтобы достичь вектора, например:

baddies[0][i];
...