James Kanze
10/12/2008 10:12:00 AM
On Oct 12, 10:08 am, Juha Nieminen <nos...@thanks.invalid> wrote:
> puzzlecracker wrote:
> > Say I have a vector<int> intVec, and I reserve some sapce
> > intVec.reserve(100);
> > Is it fair to assume the vector contains enough space for
> > 100 elements. In which case, the capacity -- ability to
> > store 100 elements without a relocation -- is 100.
> > Then what is the difference for intVec.resize(100)?
> The difference is that, among other things, the new elements
> will *not* be initialized with reserve(), and the push_back()
> and at() functions will behave differently. Accessing elements
> beyond size() with operator[] (even if space has been reserved
> for those elements) is probably undefined behavior, especially
> if the element type is a class which requires initialization.
There's no probably...especially about it. It's undefined
behavior (except for at(), which is guaranteed to throw). In
any good implementation, something like
int
main()
{
std::vector< int > v ;
v.reserve( 100 ) ;
v[ 50 ] ;
return 0 ;
}
will result in a runtime error (core dump under Unix).
More generally, there are two main uses of reserve(): to ensure
the validity of iterators and pointers to elements, and as an
optimization measure. It doesn't affect the logical state of
the container.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34