Dans l'exemple suivant, une structure std :: map est remplie avec 26 valeurs de A - Z (pour la clé) et 0 - 26 pour la valeur. Le temps pris (sur mon système) pour rechercher la dernière entrée (10000000 fois) est d'environ 250 ms pour le vecteur et de 125 ms pour la carte. (J'ai compilé en utilisant le mode release, avec l'option O3 activée pour g ++ 4.4)Quel type de conteneur offre de meilleures performances (moyennes) que std :: map?
Mais si pour une raison étrange je voulais de meilleures performances que std :: map, quelles structures de données et fonctions devrais-je utiliser? Je m'excuse si la réponse vous semble évidente, mais je n'ai pas beaucoup d'expérience dans les aspects critiques de la programmation C++.
#include <ctime>
#include <map>
#include <vector>
#include <iostream>
struct mystruct
{
char key;
int value;
mystruct(char k = 0, int v = 0) : key(k), value(v) { }
};
int find(const std::vector<mystruct>& ref, char key)
{
for (std::vector<mystruct>::const_iterator i = ref.begin(); i != ref.end(); ++i)
if (i->key == key) return i->value;
return -1;
}
int main()
{
std::map<char, int> mymap;
std::vector<mystruct> myvec;
for (int i = 'a'; i < 'a' + 26; ++i)
{
mymap[i] = i - 'a';
myvec.push_back(mystruct(i, i - 'a'));
}
int pre = clock();
for (int i = 0; i < 10000000; ++i)
{
find(myvec, 'z');
}
std::cout << "linear scan: milli " << clock() - pre << "\n";
pre = clock();
for (int i = 0; i < 10000000; ++i)
{
mymap['z'];
}
std::cout << "map scan: milli " << clock() - pre << "\n";
return 0;
}
Bonne réponse, je le répète. Une carte non ordonnée, puis optimiser les appels (supprimer le code orienté objet aide aussi ... mais je peux être flambé pour dire que :-) –
@Etamar: Je ne pense pas que la suppression du code OO aidera, sauf si vous utilisez 'virtual' lot. – kennytm
@Etamar: Voulez-vous dire se débarrasser des cours? Comment cela pourrait-il accélérer quelque chose? – GManNickG