Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::vector::resize() vs. std::vector::reserve()

Tags:

c++

stl

vector

There is a thread in the comments section in this post about using std::vector::reserve() vs. std::vector::resize().

Here is the original code:

void MyClass::my_method() {     my_member.reserve(n_dim);     for(int k = 0 ; k < n_dim ; k++ )          my_member[k] = k ; } 

I believe that to write elements in the vector, the correct thing to do is to call std::vector::resize(), not std::vector::reserve().

In fact, the following test code "crashes" in debug builds in VS2010 SP1:

#include <vector>  using namespace std;  int main() {     vector<int> v;     v.reserve(10);     v[5] = 2;      return 0; } 

Am I right, or am I wrong? And is VS2010 SP1 right, or is it wrong?

like image 413
Mr.C64 Avatar asked Oct 23 '12 11:10

Mr.C64


People also ask

What does std::vector resize do?

vector::resizeResizes the container to contain count elements. If the current size is greater than count , the container is reduced to its first count elements.

What is vector Reserve?

std::vector::reserveRequests that the vector capacity be at least enough to contain n elements. If n is greater than the current vector capacity, the function causes the container to reallocate its storage increasing its capacity to n (or greater).

How much space does a vector Reserve?

For vector v2 we are reserving capacity to hold 25 elements, that is why as soon as first element is inserted vector's capacity becomes 25.

What is the difference between std::vector and vector?

Difference between std::vector and std::array in C++ As array is fixed size, once initialized can't be resized. Vector occupies more memory. Array is memory efficient data structure. Vector takes more time in accessing elements.


2 Answers

There are two different methods for a reason:

std::vector::reserve will allocate the memory but will not resize your vector, which will have a logical size the same as it was before.

std::vector::resize will actually modify the size of your vector and will fill any space with objects in their default state. If they are ints, they will all be zero.

After reserve, in your case, you will need a lot of push_backs to write to element 5. If you don't wish to do that then in your case you should use resize.

One thing about reserve: if you then add elements with push_back, until you reach the capacity you have reserved, any existing references, iterators or pointers to data in your vector will remain valid. So if I reserve 1000 and my size is 5, the &vec[4] will remain the same until the vector has 1000 elements. After that, I can call push_back() and it will work, but the stored pointer of &vec[4] earlier may no longer be valid.

like image 172
CashCow Avatar answered Oct 04 '22 02:10

CashCow


It depends on what you want to do. reserve does not add any elements to the vector; it only changes the capacity(), which guarantees that adding elements will not reallocate (and e.g. invalidate iterators). resize adds elements immediately. If you want to add elements later (insert(), push_back()), use reserve. If you want to access elements later (using [] or at()), use resize. So youre MyClass::my_method can be either:

void MyClass::my_method() {     my_member.clear();     my_member.reserve( n_dim );     for ( int k = 0; k < n_dim; ++ k ) {         my_member.push_back( k );     } } 

or

void MyClass::my_method() {     my_member.resize( n_dim );     for ( int k = 0; k < n_dim; ++ k ) {         my_member[k] = k;     } } 

Which one you chose is a question of taste, but the code you quote is clearly incorrect.

like image 33
James Kanze Avatar answered Oct 04 '22 02:10

James Kanze