Я написал код на C ++, где я тестирую время выполнения вектора push_back. У меня есть вектор вектора. Я назвал мой основной вектор mainVec, а встроенный вектор — subVec. Итак, я вставил 2 ^ 20 элементов в subVec, а затем вставил 2 ^ 20 назад в mainVec. Однако в цикле subVec-push_back у меня есть команда cout, которая не выполняется. Я надеялся, что вы можете указать на мою ошибку.
Вот код (в коде нет ошибки):
vector<int> subVec;
vector< vector<int> > mainVec;
//Fills the subvector with 2^20 elements
for( size_t i = 0; i < (pow(2,20)+1); ++i) subVec.push_back(i);
//Filling of the maiVec with 2^20 subVec
for( size_t j = 10; j < 21; ++j) {
cout << pow(2,j) << endl;
clock_t t1 = clock();
//2^j times subVec is push_backed for j < 21
for( size_t k = 0; k < pow(2,j); ++k ) mainVec.push_back( subVec );
t1 = clock()-t1;
//Outputting to file
cout << "\t" << (float(t1) / CLOCKS_PER_SEC) << endl;
//ofs << pow(2,j) << "\t\t" << (float(t1) / CLOCKS_PER_SEC) << endl;
}
Есть несколько проблем с вашим кодом.
Во-первых, вам не нужно +1
в первом цикле, т.е. pow(2,20)+1
, Так как вы начинаете с 0 и хотите 2 ^ 20 раз, вам нужно сделать до i<2^20
,
Во-вторых, лучше рассчитать pow
s перед циклом, иначе он будет вычислять их каждый раз, и это может занять вечность.
В-третьих, вы можете сделать 1<<j
вместо pow(2,j)
, Просто к вашему сведению.
В-четвертых, и самое главное, мы говорим об огромном количестве памяти здесь. Даже ваш самый маленький цикл выполняет 2 ^ 30 дюймов, что составляет 4 ГБ памяти. Я предполагаю, что ваша программа просто убивает ваш компьютер, и причина, по которой она никогда не печатает второй cout
является то, что он не попадает туда (потому что он пытается использовать файл подкачки для памяти). Попробуйте использовать меньшие числа, скажем, 2 ^ 10 для первого цикла, и посмотрите, получите ли вы выходные данные.
Других решений пока нет …