Как добавить указатели в указатель на вектор - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть это:

    std::vector<Pair *> *artistAttributes;

где Pair класс, как я могу добавить элемент в этот указатель?

Я знаю, как получить к этому доступ, если это было просто std::vector, вот так,

std::vector<Pair *> artistAttributes; 

Но я не знаю, как добавлять элементы в это, так как я очень плохо знаком с указателями.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

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

Таким образом, вы можете изменить вектор с помощью artistAttributes->push_back() (чтобы добавить новый элемент) или artistAttributes->at() (чтобы изменить существующий элемент). Эквивалентно вы также можете сделать (*artistAttributes).push_back() и (*artistAttributes).at().

0 голосов
/ 05 ноября 2018

Я очень хорошо знаком с указателями.

Существует семантическое различие между указателями, которые просто указывают на объекты в автоматическом хранилище («стек»), и указателями на объекты в свободном хранилище («куча») в том, что указатели на объекты в куче должны в некоторых случаях точка, используемая для освобождения (delete / delete[]) памяти, ранее выделенной с помощью new (или new[]).

Это не просто легко забыть, но нельзя сделать, если между распределением и освобождением возникает исключение. Чтобы сделать это проще, были изобретены умные указатели, которые следуют RAII / RDID -idiom («Приобретение ресурса - инициализация / уничтожение ресурса - удаление»): необработанные указатели инкапсулированы в объектах, которые управляют временем жизни ресурса. они справляются.

Это позволяет во многих обстоятельствах избегать следования правилу 3/5 (что в современном C ++ больше соответствует правилу большой четверки (с половиной) ) но вместо этого используйте правило нуля .

Кроме того, нет смысла иметь указатель на std::vector<>, поскольку векторы дешевы для копирования (по сравнению с неудобством управления динамически выделяемой памятью).

Так что вместо

std::vector<Pair *> *artistAttributes;

лучше использовать

std::vector<std::shared_ptr<Pair>> artistAttributes;
0 голосов
/ 05 ноября 2018

Смотрите это:

std::vector<Pair*> *artistAttributes;
artistAttributes = new std::vector<Pair*>;
artistAttributes->push_back(new Pair())
...
for(int i=0; i<artistAttributes->size(); i++)
   delete (*artistAttributes)[i] // Don't forget
delete artistAttributes; // Don't forget

По сравнению с:

std::vector<Pair*> artistAttributes;
//artistAttributes = new std::vector<Pair*>; // no needed
artistAttributes.push_back(new Pair()) // use . instead of ->
...
for(int i=0; i<artistAttributes.size(); i++)
   delete artistAttributes[i] // Don't forget

и по сравнению с:

std::vector<Pair> artistAttributes;
//artistAttributes = new std::vector<Pair*>; // no needed
artistAttributes.push_back(Pair())
...