Слышал, что если делать в вектор push_back, то если у него не хватает внутреннего буфера, то он увеличивается в 1.5 раза. Правда ли?
Будет ли тоже самое происходить когда я буду делать последовательно resize:
for(int i=0; i<N; i++) {
b.resize(i+1);
b[i] = i;
}
Написал код, который сравнивает время исполнения каждой из версий. Вторая получается немного медленнее.
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
int main() {
const int N = 10000000;
clock_t tStart;
vector<int> a;
tStart = clock();
for(int i=0; i<N; i++) a.push_back(i);
printf("Time taken: %.4f sec\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
vector<int> b;
tStart = clock();
for(int i=0; i<N; i++) {
b.resize(i+1);
b[i] = i;
}
printf("Time taken: %.4f sec\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
return 0;
}
Пример вывода на ideone:
Time taken: 0.0649 sec
Time taken: 0.0692 sec
Лучше для добавления элементов брать не vector а list или unordered_set. Можно запустить вот это и узнать что происходит с вектором.
for(int i=0; i<N; i++) {
b.resize(i+1);
cout<<i+1<<" "<<b.capacity()<<endl;
}
В одной онлайн IDE
1 1
2 2
3 4
4 4
5 8
...
16 16 17 32
b.resize(i+1);
b[i] = i;
Два раза присваивается значение сначала 0 потом цифра наверное поэтому дольше.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости