2016-06-09 7 views
0

Мне нужно заполнить вектор конкретными значениями. Я обнаружил, что приведенный ниже код работает, за исключением того, что a.size() не может измениться с 0. Добавление вызова изменения размера после ввода элементов занимает почти в два раза больше. Кажется, должен быть O (1) способ обновить размер, так как мне не нужно менять какие-либо элементы. Здесь? Должен ли я просто не беспокоиться?std :: векторный размер не обновляется после запаса и заполняется

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    int n = 1e9; 
    vector<float> a; 
    a.reserve(n); 
    for (int i=0; i<n; i++) 
    a[i] = i; 

    cout << a[2]; //successfully prints as 1 
    cout << a.size(); //confusingly prints as 0 
} 

Редактировать: это не дубликат, так как связанный вопрос не касается бенчмаркинга. Он просто спрашивает разницу в резерве и изменении размера, о котором я не спрашиваю. Этот код работает и работает быстро, но имеет уродливый побочный эффект, оставляя size() «неправильным».

+2

Это * * является дубликатом. Ваш код сломан. Тот факт, что он работает прямо сейчас на вашей машине, не имеет значения: вы получаете доступ к унифицированной памяти. – Ven

ответ

2

std::vector::reserve() не предназначен для создания элементов. Чтобы создать элементы, вы можете использовать std::vector::resize().

Попробуйте это:

#include <iostream> 
#include <vector> 
#include <math.h> 

using namespace std; 

int main() 
{ 
    int n = 1e9; 
    vector<float> a; 
    a.resize(n); 
    for (int i=0; i<n; i++) 
    a[i] = i; 

    cout << a[2]; 
    cout << a.size(); 
} 
+0

Я понимаю, что резерв не создает элементов. Он предотвращает повторное изменение размера, как когда один раз push_backs. Ваш метод придумал для меня, но я сравниваю его на 5.45s вместо 3.78 на моем, чтобы выполнить то же самое. 50-процентный штраф, где, похоже, это должно быть O (1)? –

+2

@DavidLerner 3.78 для * what * хотя? Для сломанного кода с неопределенным поведением? – juanchopanza

+0

@juanchopanza для кода, который выполняет одно и то же. Я даже проверил вывод, напечатав 'a [2]'. –