Как создать пустой вектор в С++?

Я хотел добавить элементы в векторе, совсем не сложно.

#include <iostream>
#include <vector>

int main(){
    int n;
    std::cin>>n;
    std::vector<int> arr(n);
    for(int i=0;i<n;i++){
        arr.push_back(i);
    }
    for(int i=0;i<n;i++){
       std::cout<<arr[i];
    }
    std::cout<<"\n";
    std::cout<<arr.capacity()<<"\n";
    std::cout<<arr.size()<<"\n";


 }

Но проблема в том, что когда я компилирую, размер и емкость в 2 раза больше, чем размер, который я указал в коде (в данном случае размер равен n), и распечатываются n нулей.


c++
person Ste1Drag    schedule 02.10.2019    source источник
comment
stackoverflow.com/questions/8928547/   -  person hegel5000    schedule 02.10.2019


Ответы (1)


push_back всегда добавляет новые элементы в конец vector.

std::vector<int> arr(n); устанавливает начальный размер n.

Следовательно, вы получите более n элементов.

Использование просто std::vector<int> arr; является хорошим решением — беспокойтесь о проблемах перераспределения только в том случае, если ваш профилировщик производительности выделяет это как узкое место.

person Bathsheba    schedule 02.10.2019
comment
о проблемах с перераспределением беспокойтесь только в том случае, если ваш профилировщик производительности выделяет это как узкое место. Что arr.reserve (n) может помочь исправить :) РЕДАКТИРОВАТЬ: имел в виду reserve, а мои руки написали resize.. Derp.. :/ - person Algirdas Preidžius; 02.10.2019
comment
@Paul92: я не согласен с этим. Если бы у меня был доллар за каждый бит UB, который я наткнулся из-за неуместного arr[i], я был бы очень, очень богат. Мне нравится простота, когда мне не нужно беспокоиться о том, сколько вещей я поместил в вектор. - person Bathsheba; 02.10.2019
comment
@Paul92 Paul92 Я согласен с Вирсавией, если вы хотите избежать перераспределения, либо используйте arr.reserve и arr.push_back, либо, по крайней мере, используйте arr.at(i)=..., так как это проверяется. - person eike; 02.10.2019
comment
Если вы действительно беспокоитесь, то reserve и emplace_back трудно превзойти. Но с такой легкой полезной нагрузкой, как int, это вряд ли уместно. - person Bathsheba; 02.10.2019
comment
Да, но я как-то ожидал, что когда я вставлю размер, не добавляя элементы в вектор, я ожидал, что размер будет равен нулю, а емкость будет n , но размер и емкость равны нулю, вот что меня смущает. - person Ste1Drag; 02.10.2019
comment
@ user700999: Именно так это делает Java, но в мире C++ мы более взрослые. - person Bathsheba; 02.10.2019