Когда я должен использовать вектор объектов вместо вектора указателей?

Это тебе не поможет. Вам все еще нужен файл addon.js.

Смотрите здесь: https://github.com/storybooks/storybook/issues/5249

Я думаю, вам нужно подождать.

https://github.com/storybooks/storybook/issues/5249#issuecomment-472179512

12
задан Runcible 24 February 2009 в 00:49
поделиться

4 ответа

Необходимо использовать вектор объектов каждый раз, когда возможный; но в Вашем случае это не возможно.

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

Основное решение состоит в том, чтобы использовать интеллектуальный указатель. ПредC++ 11 идет auto_ptr, но это не может использоваться в стандартном контейнере. C++ 11 имеет std::unique_ptr и std::shared_ptr которые разработаны, чтобы быть применимыми в контейнерах (я предпочитаю std::unique_ptr если мне действительно не нужен подсчет ссылок). Если Вы не можете использовать C++ 11, лучшим решением являются интеллектуальные указатели Повышения.

17
ответ дан 2 December 2019 в 04:25
поделиться

В этом случае, храня вектор Animal не работал бы на Вас, поскольку у Ваших животных есть различные размеры, и Вы не смогли бы сохранить производные объекты в пробелах, предназначенных для содержания базового класса. (И даже если они будут тем же размером, то Вы не получите намеченный полиморфный эффект, поскольку методы базового класса будут выполняться - виртуальность метода не играет роли, если Вы не получаете доступ к нему через указатель или ссылку.)

Если Вы хотите избежать раздражения из-за управления памятью сами, Вы могли бы рассмотреть хранение интеллектуального указателя, такого как shared_ptr (обратите внимание, что auto_ptr не работает с контейнерами STL, по словам Max Lybbert), или некоторый вариант этого. Тем путем можно все еще использовать полиморфный класс, но это - немного меньше работы для Вас.

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

8
ответ дан 2 December 2019 в 04:25
поделиться

Вместо того, чтобы использовать shared_ptr со стандартными контейнерами STL, смотрите на Библиотеку Контейнера Указателя Повышения. Это разработано для решения точно этой проблемы.

8
ответ дан 2 December 2019 в 04:25
поделиться

Если Вы когда-нибудь слышите аргумент, но это будет настолько дорогостоящим для копирования их структуры все время, когда Вы захотите использовать полные объекты вместо указателей в векторе, то Ваши 2 основных аргумента:

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

Добавленная стоимость копирования обычно берется при добавлении материала к контейнеру, не, когда использование данных - думает немного об этом: что Вы делаете больше всего? добавить объекты или использовать их?

Однако при добавлении polymorphical объектов, указатели необходимы, чтобы не резать.

1
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: