Инициализируйте std :: vector, вызывая конструктор не по умолчанию для каждого элемента с различными аргументами, без ненужного копирования - PullRequest
0 голосов
/ 19 марта 2012

Я ищу способ инициализации вектора с минимальным количеством копий.

struct T {
   std::vector<int> v;
   //some stuff here ; pod
   T(std::vector<int> vv):v(vv){}://a non default constructor
};

Теперь, чтобы инициализировать вектор, я делаю

std::vector<T> vec(n);
for (auto it = vec.begin() ;it != vec.end(),++it) 
{
  // do some stuff to *it;
}

"сделать кое-что здесь" в основном просто переделать то, что сделано в конструкторе, и поэтому у меня есть две инициализации T.v ... Я тоже думал сделать

std::vector<T> vec;
for (int i = 0 ; i< n;++i) 
{
   std::vector<int> vv = // blabla
   T t(vv);
   vec.push_back(t);
}

, что снова приводит к копированию vv ...

Так как же я инициализирую вектор структуры, где каждый элемент инициализируется с помощью конструктора не по умолчанию (вызов с другим аргументом для каждого элемента)?

1 Ответ

4 голосов
/ 19 марта 2012

Используйте reserve и создайте элементы на месте:

std::vector<T> vec;
vec.reserve(n);     // now guaranteed O(1) insertions at the end

for (unsigned i = 0; i != n; ++i)
{
   vec.emplace_back(vv);  // or whatever
}

Вы также можете использовать старый стиль push_back();Если повезет, компилятор оптимизирует несколько ненужных копий.Вы, вероятно, также должны добавить конструктор на основе итераторов и список инициализатора к T, просто чтобы дать вам некоторую гибкость.

...