vector::push_back(...)
работает по вызову по ссылке (а не по вызову по значению), поэтому в первый момент переданный объект не копируется
vector::push_back()
хранит копию добавляемого объекта.
Хранит ли вектор внутри указатели или прямые ссылки?
То, как вектор внутренне хранит элементы, является деталью реализации, но сложность и требования к поведению оставляют мало места для вариаций. Vector хранит элементы в смежных местах памяти, очень похожих на массивы.
Когда необходимо расширить вектор, копируются ли сами содержащиеся элементы или их адреса?
Когда вектор расширяется, ему нужно скопировать все объекты в новую непрерывную память, опять же, это деталь реализации. Если элементы являются указателями, то сами указатели будут скопированы.
Сами объекты должны храниться в векторе или, скорее, указатели на эти объекты. Есть ли какая-то лучшая практика для этого?
Если ваши объекты больше и вы не хотите размещать их в векторе, вы можете хранить указатели на них в векторе, но затем не хранить необработанные указатели в векторе, используйте подходящий умный указатель согласно вашему требованию. Это гарантирует идеальный RAII , и вам не нужно беспокоиться об управлении памятью.