Изменение размера вектора

346
20 мая 2017, 19:46

Слышал, что если делать в вектор 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
Answer 1

Лучше для добавления элементов брать не 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 потом цифра наверное поэтому дольше.

READ ALSO
Вылет при выполнения + Box2D

Вылет при выполнения + Box2D

При нажатии на кнопку "Старт", в консольке выскакивает ошибка, указывающую на один из заголовочных файлов Box2D, после чего компилятор начинает...

213
Конвертирование WAV в MP3

Конвертирование WAV в MP3

Использую JavaScript-порт кодировщика LAME для конвертирования WAV-файла в MP3

355
Получение данных ajax запросом

Получение данных ajax запросом

Вообщем есть ajax запрос:

342