std::vector preallocation (size n, capacity n + 2)

My use-case is the following: A vector of size n read from a binary file.

Among other variants (iostreams, in my case custom code doing decompression), I can do something with semantics like this:

vector<myElem> v;
v.resize(n); // from my understanding v now has size n and capacity n
fread(v.data(), sizeof(myElem), n, myFile);

However, later I will have to (repeatedly) add and remove two elements to such a vector. (While this sounds pretty stupid, it can have positive effects to add sentinel values to lists so that intersections of sorted lists do not have to add comparisons for bound-checking).

For that, I would love to prealloacte a vector with size n and capacity n + 2 . I think I could do something like:

vector<myElem> v;
v.resize(n + 2); // from my understanding v now has size n + 2 and capacity n + 2 
v.pop_back();
v.pop_back(); // v now has size n and most probably still has capacity 2 (unless n is pretty small)
fread(v.data(), sizeof(myElem), n, myFile);

Obviously, this is neither pretty nor guaranteed to behave as I would liek it to. In practice, I think it really should behave that way for big n and if small n should ever occur, a reallocation doesn't matter.

Still, it would be great to hear if there are better ways.

edit:

I am unsure how I can make use of reserve in my case. If I reserve a capacity of n + 2 , the vector still has size 0 . If I resize to n , i also change the capacity.

If I resize first and then reserv, I allocate memory two times and copy the whole vector in the process.


You can use v.reserve(n + 2) to change the vector 's capacity without altering its size. Take a look at the documentation to better understand what is going on.


Your understanding of capacity isn't quote correct:

v.resize(n); // from my understanding v now has size n and capacity n

v has size n , yes, but all you can say about the capacity is that it is >= n . It could be n , it could be n + 1 , it could be 3 * n . Similarly:

v.resize(n + 2); // from my understanding v now has size n + 2 and capacity n + 2 
v.pop_back();
v.pop_back(); // v now has size n and most probably still has capacity 2 (unless n is pretty small)

At this point, what we can say with certainty is v.size() == n && v.capacity() >= n + 2 .

If what you want to do is

I would love to prealloacte a vector with size n and capacity n + 2

then that's simply:

v.reserve(n + 2); // capacity >= n+2, size == 0
v.resize(n);      // capacity >= n+2, size == n

You want

v.reserve(n+2);
v.resize(n);

This is guaranteed to give you a vector with a size of n and a capacity of at least n+2 :

23.3.7.3 vector capacity

void reserve(size_type n)

...No reallocation shall take place during insertions that happen after a call to reserve() until the time when an insertion would make the size of the vector greater than the value of capacity().

void resize(size_type n)

...If size() < sz appaends sz - size() default-inserted elements to the sequence

So resize to a larger than current size is equivalent to inserting elements, and after a reserve, no insertion operation can reallocate memory until its size would exceed the reserved capacity...

链接地址: http://www.djcxy.com/p/91714.html

上一篇: 用nltk分块

下一篇: std ::向量预分配(大小为n,容量为n + 2)