2015-07-13 2 views
4

Мне нужно нажать 66 000 векторов (число векторов не фиксировано, оно также может быть 90 000 векторов. Для краткости я показываю приведенный ниже код с примером из 66 000 векторов) вектора типа в следующий вектор:Вставка в векторы C++

vector<int> vec; 

Размер каждого из 66 000 векторов составляет 9000 элементов. Я использую следующие для делать то же самое:

vec.reserve(66000*9000); 
for(int j=0;j<66000;j++) 
    for(int i=0;i<9000;i++) //9000 elements in vec1[i] per vector is not fixed 
     vec.push_back(vec1[i]); //i am pushing i as an example 

Есть ли каким-то образом, с помощью которого я могу увеличить эффективность этого кода?

Мне нужно конкатенировать слишком много векторов, поэтому решение для них потенциально отличается от конкатенации двух векторов. Также я не могу использовать многопоточность, как указано в предыдущем вопросе

+1

если размер исправлен, почему бы не использовать массив/'std :: array' вместо этого? –

+0

@NikolaDimitroff Потому что он большой. Конечно, можно динамически выделять 'std :: array', но что это поможет? –

+2

Является ли двойное использование «i» преднамеренным? – FooBar

ответ

6

Попробуйте следующее

std::vector<int> vec; 
vec.reserve(66000*other_vec.size()); 

for (size_t i = 0; i < 66000; i++) 
{ 
    vec.insert(vec.end(), other_vec.begin(), other_vec.end()); 
} 
+0

вставляется быстрее, чем push_back? Если да, в чем причина того же –

+0

@Steg Verner Я думаю, что вставка быстрее, потому что хотя бы общие вычисления производятся только один раз. –

+0

Считывание интервала @StegVerner известно быстрее. Проверьте книгу Скотта Мейерса «Эффективный STL». Хорошее чтение, хотя – PSIAlt

1

Вы можете использовать resize() вместо reserve(). Удалите push_back, когда используется resize(). Память выделяется resize() и инициализирует. reserve просто выделяет, но не инициализирует.

+1

Тогда он должен удалить 'push_back'. Также я думаю, что это даст слишком малое преимущество. – PSIAlt

+1

@PSIAlt _ «Также я думаю, что это даст слишком малое преимущество». _ Не со многими небольшими перераспределениями. –

+1

@ πάνταῥεῖ Какое перераспределение? Он уже запасает достаточно памяти. –

0

Вы можете пойти в исходных данных непосредственно с помощью данных():

http://en.cppreference.com/w/cpp/container/vector/data

Затем вы можете скопировать данные непосредственно (например, просто тетсру).

std::vector<int> foo; 
for (int i=0; i<10;++i){ 
    foo.push_back(i); 
} 

std::vector<int> bar; 

bar.resize(10*10); 

int pos = 0; 
int size = foo.size()*sizeof(int); 
for (int i=0; i<10; ++i){ 
    memcpy(bar.data()+pos/sizeof(int),foo.data(),size); 
    pos += size; 
} 


for (size_t i=0; i<bar.size(); ++i){ 
    cout << i << " " << bar[i] << endl; 
} 
+0

STL использует memcpy в любом случае, когда это безопасно. См. Http://maintainablecode.logdown.com/posts/159916-memcpy-memmove-and-memset-are-deprecated. Это слишком сложно/подвержено ошибкам и на самом деле ничего не покупает. – Mark

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