La scelta del contenitore da utilizzare deve essere fatta in base all'utilizzo che ne intendi fare (soprattutto da come intendi accedere ai dati). Per la semplice allocazione std::vector è molto più veloce di std::list; ho fatto questo piccolo benchmark (GNU/Linux 2.6 64 bit, G++ 4.3)
codice:
#include <vector>
#include <list>
#include <iostream>
#include <sys/time.h>
using namespace std;
double GetMSecDifference(timeval Before, timeval After)
{
return (After.tv_sec-Before.tv_sec) * 1000 + (After.tv_usec - Before.tv_usec) / 1000;
}
int main()
{
timeval before, after;
int max;
double elapsedTime;
cout<<"Inserire il numero di elementi: ";
cin>>max;
cout<<"std::vector, dimensione sconosciuta"<<endl;
gettimeofday(&before, NULL);
try
{
vector<int> vector1;
for(int i=0;i<max;i++)
vector1.push_back(i);
}
catch(exception & ex)
{
cerr<<"Catturata eccezione: "<<ex.what()<<endl;
}
gettimeofday(&after, NULL);
cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<" ms"<<endl;
cout<<"std::vector, dimensione nota"<<endl;
gettimeofday(&before, NULL);
try
{
vector<int> vector2(max);
for(int i=0;i<max;i++)
vector2.push_back(i);
}
catch(exception & ex)
{
cerr<<"Catturata eccezione: "<<ex.what()<<endl;
}
gettimeofday(&after, NULL);
cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<" ms"<<endl;
cout<<"Array C allocato con new"<<endl;
gettimeofday(&before,NULL);
try
{
int * vector3=new int[max];
for(int i=0;i<max;i++)
vector3[i]=i;
}
catch(exception & ex)
{
cerr<<"Catturata eccezione: "<<ex.what()<<endl;
}
gettimeofday(&after, NULL);
cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<endl;
cout<<"std::list, dimensione sconosciuta"<<endl;
gettimeofday(&before, NULL);
try
{
list<int> list1;
for(int i=0;i<max;i++)
list1.push_back(i);
}
catch(exception & ex)
{
cerr<<"Catturata eccezione: "<<ex.what()<<endl;
}
gettimeofday(&after, NULL);
cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<endl;
return 0;
}
.
Risultati:
codice:
matteo@teoubuntu:~/cpp$ ./vectorbenchmark.o
Inserire il numero di elementi: 100000
std::vector, dimensione sconosciuta
Tempo trascorso: 3 ms
std::vector, dimensione nota
Tempo trascorso: 4 ms
Array C allocato con new
Tempo trascorso: 0 ms
std::list, dimensione sconosciuta
Tempo trascorso: 30 ms
per 100000 elementi da 8 byte ciascuno è praticamente indifferente la scelta tra i primi tre, mentre la lista, come detto, è nettamente più lenta. Aumentando il numero di elementi il distacco si fa più consistente:
codice:
matteo@teoubuntu:~/cpp$ ./vectorbenchmark.o
Inserire il numero di elementi: 10000000
std::vector, dimensione sconosciuta
Tempo trascorso: 515 ms
std::vector, dimensione nota
Tempo trascorso: 565 ms
Array C allocato con new
Tempo trascorso: 140 ms
std::list, dimensione sconosciuta
Tempo trascorso: 2750 ms
.