supongo que si yo fuera a probar algo como esto, probablemente me pongo con el código de algo en este orden:
#include <list>
#include <vector>
#include <algorithm>
#include <deque>
#include <time.h>
#include <iostream>
#include <iterator>
static const int size = 30000;
template <class T>
double insert(T &container) {
srand(1234);
clock_t start = clock();
for (int i=0; i<size; ++i) {
int value = rand();
T::iterator pos = std::lower_bound(container.begin(), container.end(), value);
container.insert(pos, value);
}
// uncomment the following to verify correct insertion (in a small container).
// std::copy(container.begin(), container.end(), std::ostream_iterator<int>(std::cout, "\t"));
return double(clock()-start)/CLOCKS_PER_SEC;
}
template <class T>
double del(T &container) {
srand(1234);
clock_t start = clock();
for (int i=0; i<size/2; ++i) {
int value = rand();
T::iterator pos = std::lower_bound(container.begin(), container.end(), value);
container.erase(pos);
}
return double(clock()-start)/CLOCKS_PER_SEC;
}
int main() {
std::list<int> l;
std::vector<int> v;
std::deque<int> d;
std::cout << "Insertion time for list: " << insert(l) << "\n";
std::cout << "Insertion time for vector: " << insert(v) << "\n";
std::cout << "Insertion time for deque: " << insert(d) << "\n\n";
std::cout << "Deletion time for list: " << del(l) << '\n';
std::cout << "Deletion time for vector: " << del(v) << '\n';
std::cout << "Deletion time for deque: " << del(d) << '\n';
return 0;
}
Dado que se usa clock
, esto debería dar tiempo de procesador no pared del tiempo (aunque algunos compiladores como MS VC++ lo malinterpretan). No trata de medir el tiempo de inserción, excluyendo el tiempo, para encontrar el punto de inserción, ya que 1) eso requeriría un poco más de trabajo y 2) todavía no puedo entender lo que lograría. Ciertamente es no 100% riguroso, pero dada la disparidad que veo en él, me sorprendería un poco ver una diferencia significativa de las pruebas más cuidadosas. Por ejemplo, la MS VC++, me sale:
Insertion time for list: 6.598
Insertion time for vector: 1.377
Insertion time for deque: 1.484
Deletion time for list: 6.348
Deletion time for vector: 0.114
Deletion time for deque: 0.82
con gcc me sale:
Insertion time for list: 5.272
Insertion time for vector: 0.125
Insertion time for deque: 0.125
Deletion time for list: 4.259
Deletion time for vector: 0.109
Deletion time for deque: 0.109
Factoring el tiempo de búsqueda sería algo no trivial, ya que tendría que el tiempo cada iteración separado . Necesitaría algo más preciso que clock
(generalmente lo es) para producir resultados significativos a partir de eso (más sobre el pedido o leyendo un registro de ciclo de reloj). Siéntete libre de modificarlo si lo crees conveniente, como mencioné antes, me falta motivación porque no veo cómo hacer algo sensato.
No está del todo claro qué quiere decir con "...¿Insertar y eliminar elementos que se pueden hacer antes, para que no influya en los tiempos? "Si está sincronizando la inserción y la eliminación, claramente quiere que la inserción y eliminación influyan en el tiempo. –
Sí, pero no quiero la determinación de donde el punto de inserción/eliminación será parte del tiempo. – soandos
Ah, ya veo. Y además de tratar de hacer que una lista parezca más competitiva, ¿por qué exactamente querrías hacer eso? Ciertamente no te va a decir cualquier cosa relacionada con el uso del mundo real. –