std :: vector вставляет копию или ссылку на объект? - PullRequest
10 голосов
/ 17 декабря 2011

Допустим, у меня есть объект, который я выделил динамически.Если я вставлю его в вектор STL, будет ли в него вставлена ​​ссылка или копия этого объекта?

Это общий вопрос.Например:

class vec {
vector<obj> vec;
void addToVec(obj a) {
    // insert a into vec
 }
  ...
  ...
  ...
 }

obj* a = new obj;
 vec* v = new vec;
 vec.addToVec(a); 

Если я удаляю v, будет ли возражать и кубик?

Ответы [ 3 ]

9 голосов
/ 17 декабря 2011

будет ли ссылка вставлена ​​в вектор или копию этого объекта?

Copy (это означает, что ваш class должен быть способен копировать, иначе ошибка компилятора).

Уточнение : Ссылки не могут быть назначены в std::vector<>. Кроме того, здесь объект имеет более широкий смысл, это может быть обычная переменная или указатель, но std::vector<> принимает только копию.

Обновление : после C ++ 11 большинство стандартных контейнеров предлагают std::move() объекта с использованием «методов API-значений rvalue baed»; где копия не может быть выполнена.

7 голосов
/ 17 декабря 2011

Если у вас есть объект типа T, который вы выделили динамически, и вы помещаете указатель на объект на std::vector<T*>, тогда копия указателя толкаетсяЕсли вы разыменуете указатель и помещаете результат в std::vector<T>, то создается копия объекта.Коллекции всегда делают копии.Таким образом, коллекции указателей делают копии указателя, а коллекции экземпляров класса делают копии самих экземпляров (используя конструкцию копирования IIRC).

2 голосов
/ 17 декабря 2011

Вы проверили ссылку :

void push_back ( const T& x );

Добавить элемент в конце

Добавляет новый элемент в концевектор, после его текущего последнего элемента. Содержимое этого нового элемента инициализируется копией x.

Это эффективно увеличивает размер вектора на единицу, что вызывает перераспределение внутренней выделенной памяти, если размер вектора был равенна векторную емкость перед звонком.Перераспределение делает недействительными все ранее полученные итераторы, ссылки и указатели

...