A std :: вектор указателей? - PullRequest
       4

A std :: вектор указателей?

1 голос
/ 05 сентября 2010

Вот что я пытаюсь сделать. У меня есть std :: vector с определенным количеством элементов, он может расти, но не уменьшаться. Дело в том, что это своего рода клетка, поэтому на этой позиции может не быть ничего. Вместо того чтобы создавать пустой объект и тратить память, я подумал о том, чтобы просто обнулить эту ячейку в std::vector. Проблема в том, как я могу получить указатели там без необходимости управлять моей памятью? Как я могу воспользоваться тем, что нет необходимости делать новые и следить за указателями?

Ответы [ 5 ]

4 голосов
/ 05 сентября 2010

Насколько велики объекты и насколько редким, по вашему мнению, будет вектор? Если объекты невелики или если отверстий не так много, стоимость наличия нескольких «пустых» объектов может быть ниже стоимости динамического размещения объектов и управления указателями на них.

Тем не менее, если вы хотите хранить указатели в векторе, вы захотите использовать вектор умных указателей (например, vector<shared_ptr<T>>) или контейнер, предназначенный для собственных указателей (например, Boost's ptr_vector<T>). ).

0 голосов
/ 05 сентября 2010

The issue is that how do I get pointers in there without needing to manage my memory?

Конечно, вы можете сделать это, используя shared_ptr или другие подобные методы, упомянутые здесь.Но в ближайшем будущем вы столкнетесь с некоторой проблемой, когда вам придется управлять собственной памятью.Поэтому, пожалуйста, освоитесь с концепцией указателя.

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

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

0 голосов
/ 05 сентября 2010

Вы можете использовать умный указатель. Например, boost :: shared_ptr.

0 голосов
/ 05 сентября 2010

Вы можете использовать deque для хранения постоянно растущего числа объектов, а свой вектор - для указателей на объекты. Deque не лишит законной силы указатели на существующие объекты, которые он держит, если вы только добавляете новые объекты в его конец. Это намного меньше затрат, чем выделение каждого объекта отдельно. Просто убедитесь, что deque уничтожен после или одновременно с вектором, чтобы не создавать висячие указатели.

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

0 голосов
/ 05 сентября 2010

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

Похоже, что лучшим решением для вас было бы использовать boost :: необязательный. Я считаю, что это именно та семантика, которую вы ищете. (http://www.boost.org/doc/libs/1_39_0/libs/optional/doc/html/index.html).

На самом деле, после того, как я написал это, я понял, что ваш вариант использования (например, дорогой конструктор по умолчанию) используется boost :: option docs: http://www.boost.org/doc/libs/1_39_0/libs/optional/doc/html/boost_optional/examples.html#boost_optional.examples.bypassing_expensive_unnecessary_default_construction

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...