bschung5
bschung5

Reputation: 23

How to reserve memory for vector of vector

Assume that

vector<vector<shared_ptr<Base>>> vec
vec.reserve(100)
vec[0].reserve(20)  // Error : vector subscript out of range

I am trying to reserve memory for both outer vector and inner vector. I know that the vec is empty so I cannot reserve memory for the inner vector. I could only resize() or shrink_to_fit() afterward. However, using resize() or shrink_to_fit() is useless due to that is not what I wanted to do.

The intention of reserving memory for the inner vector is trying to allocate the memory well for faster searching of inner elements afterward. I am just wondering if I do not reserve the memory, the memory that is pre-allocated is expensive and chaos.

I would like to ask :

  1. Are there any way to reserve memory for the inner vector
  2. Does my concept of "concerning about bad allocation of memory will be caused without reserving memory for the vector" correct?

Sorry for my poor english and I am using VC++ 2010.

Upvotes: 2

Views: 3743

Answers (3)

Ulrich Eckhardt
Ulrich Eckhardt

Reputation: 17415

I'd start with how you're going to interface with the final container and what you know about its content in advance. Once you have settled on a convenient interface, you can implement the code behind it. For example, you could make sure that every new inner vector get created with a capacity of 100 elements. Or, you could use a map from an x/y pair to a shared pointer, which can make sense in a sparsely populated container. Or how about allocating the 100x100 elements statically and just not reallocating at all? The important point is that all these alternatives can be implemented without changing the interface to the final container, so this gives you the freedom to experiment with different approaches.

BTW: Check out make_shared, which avoid the allocation overhead of shared_ptr, I believe. Alternatively, Boost also has an intrusive_ptr which uses an internal reference counter. These shared_ptr instances are also only half the size of a shared_ptr. However, you need benchmarks to actually prove which way is fastest. Anything else is just more or less vague speculation and guesswork.

Upvotes: 0

Jerry Coffin
Jerry Coffin

Reputation: 490018

If you're sure you need to do this at all, I would probably resize the outer vector, then reserve space in each inner vector.

If 100 elements is even close to accurate, the space for your outer vector is almost irrelevant anyway (typically going to be something like 1200 bytes on a 32-bit system or 2400 bytes on a 64-bit system).

That may be a little less convenient (may force you to track how many items are created vs. really in use) but if you want to reserve space in your inner vectors, you don't really have a lot of choices.

Upvotes: 2

Tony Delroy
Tony Delroy

Reputation: 106068

You can't reserve memory for both inner and outer vectors... the inner vectors don't get constructed if you've only reserved space in the outer vector. You can resize the outer vector then do a reserve for each element thereof, or you can do the reserving on the inner vectors as they're added.

Upvotes: 5

Related Questions