Умные очки являются общими;Вы можете вставить в нее все, что захотите.Но вы должны выбрать правильный инструмент для работы, основываясь на том, чего вы пытаетесь достичь.Умные указатели имеют довольно специфические варианты использования.У указателей на указатели, с другой стороны, есть пара различных вариантов использования:
массивы указателей массивов указателей, для реализации двумерных массивов.Если это то, чего вы пытаетесь достичь, рассмотрите возможность использования std::vector<std::vector<T>>
или std::array<std::array<T, N>, M>
, если вы знаете, что ваш массив всегда будет иметь указатель размера M
x N
.
на указатель, используемый для изменения другого указателя из функции.В этом случае вам следует рассмотреть возможность передачи по ссылке.Если вам действительно нужны указатели в вашем коде, вы можете изменить его, передав ему T*&
, ссылку на указатель на T
.Но в зависимости от того, что вы представляете, вы можете передать свои данные, например, std::vector<T>&
.
Существуют умные указатели для автоматического управления временем жизни объектов в зависимости от того, какВы хотите, чтобы эти объекты были использованы.Они не существуют просто как средство косвенного обращения, которое открыто для множества различных способов использования, таких как необработанные указатели.Мой совет относительно того, какой инструмент использовать, будет следующим:
- Если вам нужен простой массив с изменяемым размером
T
, используйте std::vector<T>
. - Если вам нужен 2D изменяемый размермассив
T
, используйте std::vector<std::vector<T>>
. - Если вы знаете, что в вашем массиве всегда будет
N
элементов, рассмотрите возможность использования std::array<T, N>
. - Если вам нужно больше структуры,такие как строгий порядок или отношения, рассмотрите возможность использования
std::set
, std::map
, std::multimap
, std::queue
, std::stack
и т. д.
Об умных указателях:
- Если вам нужен легкий объект, который можно обойти, но у которого только один владелец, или если вам нужно инкапсулировать полиморфный объект, который используется в одном месте, рассмотрите
std::unique_ptr<T>
- Если вам нужен объект, который будет использоваться несколькими местами в коде, который не имеет единственного разумного места владения и вместо этого должен иметь распределенное владение, используйте
std::shared_ptr<T>
- Если вы хотите изменить объект изнутрифункция, такая, что объект будет жить в течениенужды функции, просто передайте по ссылке:
T&
- Если вы хотите читать, но не изменять объект в функции, где этот объект будет живым в течение времени, необходимого функции, передайте ссылку на const:
const T&
РЕДАКТИРОВАТЬ:
Увидев, что вам не разрешено использовать std::vector
для вашего задания, я понимаю, что на самом деле я не отвечаю на ваш обновленный вопрос.Но я все еще надеюсь дать вам (и будущим читателям) некоторое представление о том, для чего нужны умные указатели, а для чего они не предназначены.
Если ваш инструктор преподает C ++, но не позволяет использовать vector
s, я бы критиковал их, говоря, что vector
- чрезвычайно важный инструмент на поясе современного разработчика C ++, и его использование намного проще и безопаснее, чем альтернативы в стиле C, которые до сих пор преподаются как C ++ во многих устаревшихучебные программы.То же самое относится и к другим инструментам и методам, таким как, как правило, избегание указателей, избегание new
и delete
и эффективное использование контейнеров и алгоритмов стандартной библиотеки, которые все помогают вам писать чище, корректировать и эффективный код.