Читать «Стандарты программирования на С++. 101 правило и рекомендация» онлайн - страница 126
Андрей Александреску
Примеры
auto_ptr<T>
не являются объектами-значениями из-за своей семантики передачи владения при копировании. Использование контейнера объектов auto_ptr
(например, vector<auto_ptr<int> >
) должно привести к ошибке компиляции. Но даже в случае успешной компиляции никогда не пишите такой код — вместо этого вам следует использовать контейнер интеллектуальных указателей shared_ptr
.
container<shared_ptr<Base> >
. Альтернативой является хранение прокси-объектов, невиртуальные функции которых передают вызовы соответствующим виртуальным функциям реальных объектов.
DatabaseLock
или TcpConnection
), их следует хранить опосредованно, с использованием интеллектуальных указателей (например, container<shared_ptr<DatabaseLock> >
или container<shared_ptr<TcpConnection> >
).
map<Thing,Widget>
, но некоторые Thing
не имеют связанных с ними объектов Widget
, можно использовать map<Thing, shared_ptr<Widget> >
.
MainContainer::iterator
(которые являются значениями).
Ссылки
80. Предпочитайте push_back
другим способам расширения последовательности
Резюме
Используйте push_back
везде, где это возможно. Если для вас не важна позиция вставки нового объекта, лучше всего использовать для добавления элемента в последовательность функцию push_back
. Все прочие средства могут оказаться как гораздо менее быстрыми, так и менее понятными.
Обсуждение
Вы можете вставить элементы в последовательность в разных точках с использованием insert
; добавить элементы в последовательность можно разными способами, включая следующие:
vector<int> vec; // vec пуст
vec.resize(vec.size() + 1, 1); // vec содержит { 1 }