2012-05-15 2 views
1

Я ищу наиболее эффективный способ скопировать содержимое списка векторов в вектор. Я хочу избежать возможного перераспределения памяти.C++: эффективная копия списка векторов в векторе

Моя проблема заключается в следующем: у меня есть:

  • а std::vector<int> v, содержащие N элементов

  • список вектора std::vector< std::vector<int>* > vlist

  • , и я знаю, что общее число элементов M в векторах vlist - < = N (N и M могут быть очень большими)

Я хочу скопировать все элементы vlist в v (сначала все элементы vlist [0], затем все элементы vlist [1] и т. Д.) И в конце уменьшить размер v к M (мой проект не использует C++ 2011).

Как сделать это максимально эффективно?

спасибо.

EDIT: примечание: v уже заполнено N элементами, и я хочу заменить их на M (< = N) элементы, исходящие из других векторов.

+0

Если вы хотите избежать выделения памяти, то вы действительно не сможете получить копию, вы можете получить ссылку. Вы можете ссылаться на объект или создать его копию, возможно, наиболее интуитивно понятным вариантом является повторное использование памяти при копировании (что позволит сэкономить на распределении памяти). Так как ваш вектор содержит 'int', вы собираетесь разместить их в стеке, чтобы быть быстрее, чем выделять кучу. – Kiril

ответ

1

Я понятия не имею, если это наиболее эффективным способом, но это способ:

std::vector<int> v; 
std::vector< std::vector<int>* > vlist; 
int j = 0; 
for(int i = 0; i < vlist.size(); ++i) { 
    std::copy(vlist[i]->begin(), vlist[i]->end(), &v[j]); 
    j += vlist[i]->size(); 
} 
v.resize(j); 

Если вы действительно хотите наиболее эффективный способ, возможно, придется реализовать несколько разными способами и сравнить их скорости.

+0

OP говорит нет C++ 11 –

+0

Спасибо, пропустил это. –

0

Самый эффективный способ - не копировать его. Для чего это требует ваше приложение? Кроме того, почему у вас есть vector<* vector<int> > вместо vector<vector<int> >? Дизайн вокруг него, использование pimpl, ленивый экземпляр и т. Д.

И, в конце концов, я не уверен, что вы думаете, что можете сделать это, чтобы побить std-конструктор копии по умолчанию. Вы профилировали свое приложение, чтобы определить, по умолчанию, ctor является узким местом?

0
std::vector<int> v; 
v.reserve(N); 
for(size_t i = 0; i<vlist.size(); i++) 
{ 
    v.insert(v.end(), vlist[i]->begin(), vlist[i]->end()); 
} 

Это должно быть достаточно эффективным, если M близка к N. В противном случае это лучше вычислить M перед выделением памяти, и использовать v.reserve (M).

+3

Вы хотели использовать резерв вместо изменения размера? Также вы имели в виду это: 'vlist [i] -> begin()' и 'vlist [i] -> end()' –

+0

использовать 'v.reserve (N)' not 'v.resize (N)'. resize actual сначала устанавливает данные в значение по умолчанию, а резерв просто выделяет пространство. – andre

+0

Спасибо, теперь исправлено. –

Смежные вопросы