Re: help with vector<vector<double>>
On Aug 10, 2:47 pm, "Bo Persson" <b...@gmb.dk> wrote:
BobR wrote:
::
:: So, if you did something like:
::
:: std::vector<int> VecInt;
:: VecInt.reserve( 100 ); // sets 'capacity', not 'size'
::
:: ... and then somewhere you did:
::
:: VecInt.push_back( 1 ); // this is the 101st push_back
::
:: ... you kind-of shot yourself in the foot (it needs to realloc and
:: copy). No big thing for small vectors, but costs time on very big
:: vectors. (....and you could run out of memory during the
:: realloc/copy).
If you know that you actually need 101 push_backs, you could do a
reserve(101) :-)
If you don't know, and the numbers are reasonably random, you will get
a good performance *on average*. Note that after "shooting yourself in
the foot" at 101, you get the next 99 push_backs for free. If you
reallocate at a-million-and-one, you get the next million or so
push_backs for free. That's cheap!
Bo Persson
So I was curious to see which is faster -- pushing back onto a vector
or using direct index access of the elements. I declare a
std::vector<int> v, setting the number of elements to vSize. I set
the values using a for-loop. Then, I declare two
std::vector<vector<int> > objects, m1 & m2. The first of these I
initialize with mSize elements, and the second I use the
std::vector::reserve method to claim mSize space. The using two for-
loops I populate m1 & m2 using direct index accessing of the elements
to set them equal to v, and then I use push_back to fill m2. I time
these two for-loops as well as the whole function. What I find
(perhaps not suprisingly) is that I fill m1 much, much faster, i.e.
push_back() with reserve() are SLOW. Anyway, here's the code.
Nothing to special.
#include <vector>
#include <iostream>
#include <iomanip>
#include <time.h>
using namespace std;
int main(){
time_t t0_0,t1_0,t2_0;
time_t t0_f,t1_f,t2_f;
t0_0 = time(NULL);
int vSize = 10000000;
int mSize = 10;
vector<int> v(vSize);
for (int i=0;i<vSize;i++){v.at(i) = i;}
vector<vector<int> > m1(mSize);
vector<vector<int> > m2;
m2.reserve(mSize);
t1_0 = time (NULL);
for (int j=0;j<mSize;j++){m1.at(j) = v;}
t1_f = time(NULL);
t2_0 = time(NULL);
for (int i=0; i<mSize;i++){ m2.push_back(v);}
t2_f = time(NULL);
t0_f = time(NULL);
cout << "testTime0 = " << t0_f-t0_0 << endl;
cout << "testTime1 = " << t1_f-t1_0 << endl;
cout << "testTime2 = " << t2_f-t2_0 << endl;
return 0;
}