Стандартное векторное изменение размера - PullRequest
4 голосов
/ 05 января 2011

У меня есть некоторый std :: vector, и мне нужно изменить его размер по умолчанию. Вот код:

static int Counter = 0;
class Data
{
   /* ... */
   Data() { 
      Counter++; 
      std::cout << Counter << std::endl;
   }
};

std::vector<Data> mArray;

for (int i=0; i <= 200; ++i)
{
   mArray.push_back(Data());
}

// And resizing somewhere:
std::cout << "Resizing!\n";
mArray.resize(400, Data());

Как я понимаю, после вставки 200 элементов я могу изменить его размер с помощью функции resize, которая принимает новый размер и значение по умолчанию для каждого нового элемента.

Когда я запускаю эту программу, я вижу:

0
1
2
...
199
200
Resizing
201

Почему после изменения размера вставляется только 1 элемент?

Ответы [ 5 ]

12 голосов
/ 05 января 2011

Вы видите только счет из вашего конструктора по умолчанию, когда добавляемые записи создаются копией. Вам нужно будет добавить конструктор копирования, который также считает количество копий:

   Data(const Data& other) { 
      // Actual copying code, whatever that may be
      Counter++; 
      std::cout << Counter << std::endl;
   }
5 голосов
/ 05 января 2011

Поскольку конструктор по умолчанию вызывается один раз: std :: vector копирует его содержимое, поэтому вы фактически копируете один и тот же объект 200 раз.

3 голосов
/ 05 января 2011

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

2 голосов
/ 05 января 2011

Вы печатаете Counter++, а не размер вашего вектора (поскольку для инициализации остальной части вектора создается только 1 Data объект, он увеличивается только один раз).

2 голосов
/ 05 января 2011

Поскольку остальные 199 экземпляров данных создаются путем копирования экземпляра данных, передаваемого вами в resize () через его конструктор копирования.

...