Программирование - это искусство поиска хороших компромиссов.Динамически распределенная память может иметь место, конечно, и я могу даже подумать о проблемах, где хороший компромисс между сложностью кода и эффективностью достигается с помощью std::vector<std::vector<T>*>
.
Однако std::vector
отлично скрывает большинствоПотребности в динамически размещаемых массивах и управляемых указателях часто являются просто идеальным решением для динамически размещаемых отдельных экземпляров.Это означает, что не так часто встречаются случаи, когда неуправляемый динамически размещаемый контейнер (или динамически размещаемый независимо от того, что на самом деле) является лучшим компромиссом в C ++.
Это, на мой взгляд, не делает динамическое распределение «плохим», но просто «подозревайте», если вы видите это в коде, потому что существует высокая вероятность того, что лучшие решения могут быть возможны.
В вашем случае, например, я не вижу причин для использования динамического выделения;просто сделать функцию, возвращающую std :: vector, будет эффективно и безопасно.С любым приличным компилятором Оптимизация возвращаемого значения будет использоваться при назначении для вновь объявленного вектора, и если вам нужно присвоить результат существующему вектору, вы все равно можете сделать что-то вроде:
FindPoints().swap(myvector);
, который не будет выполнять какое-либо копирование данных, а лишь некоторое изменение указателя (обратите внимание, что вы не можете использовать явно более естественное myvector.swap(FindPoints())
из-за правила C ++, которое иногда раздражает и запрещает передачу временных значений в качестве неконстантных ссылок).
По моему опыту, самым большим источником потребностей в динамически размещаемых объектах являются сложные структуры данных, в которых один и тот же экземпляр может быть достигнут с использованием нескольких путей доступа (например, экземпляры находятся одновременно в двусвязном списке и индексируютсякарта).В стандартной библиотеке контейнеры всегда являются только владельцем содержащихся объектов (C ++ является семантическим языком копирования), поэтому может быть сложно эффективно реализовать эти решения без указателя и концепции динамического выделения.
Часто вы можете найти достаточно разумные компромиссы, которые просто используют стандартные контейнеры, однако (возможно, платят некоторые дополнительные O (log N) поиски, которых вы могли бы избежать) и которые, учитывая гораздо более простой код, могут быть IMO лучшим компромиссом вбольшинство случаев.