Je suis en train de faire une file d'attente sur la base de liste chaînée pour les opérations rapides, maintenant que ce que j'ai:algorithmes de file d'attente
template< typename T,
template<typename> class Allocator = default_allocator
>
class fast_queue
{
public:
typedef T element_type;
typedef T* element_ptr;
private:
typedef struct e_node
{
element_type val;
e_node * next;
}node_type;
typedef node_type * node_ptr;
node_ptr parent;
node_ptr child;
int m_size;
typedef Allocator<node_type> allocator_type;
public:
fast_queue()
: parent(0)
, child(0)
, m_size(0)
{
}
~fast_queue() {
this->clear();
}
void push(element_type& i)
{
node_ptr n = allocator_type::alloc();
n->val = i;
n->next = (node_ptr)0;
if(child) {
child->next = n;
} else {
parent = n;
}
child = n;
m_size++;
}
element_type pop()
{
element_type ret = parent->val;
node_ptr p = parent;
parent = parent->next;
m_size--;
allocator_type::dealloc(p);
return ret;
}
inline int size() const
{
return m_size;
}
inline bool empty() const
{
return (m_size == 0);
}
void clear()
{
while(!empty()) {
pop();
}
child = 0;
}
};
Assez simple, maintenant ce que je suis un problème avec est la fonction d'effacement() . Il semble prendre trop de temps à libérer tous les nœuds de la file d'attente (7 secondes). Donc la question est, quel pourrait être un meilleur algorithme? J'ai essayé de comprendre la mise en œuvre de std :: deque par MSVC, mais le code est si volumineux à comprendre pour moi.
EDIT: La file d'attente doit être générique, autorisant la mise en file d'attente de types arbitraires de données. Voici mon code d'essai (Windows)
DWORD time1 = timeGetTime();
fast_queue<int> queue;
for(int i = 0; i < 100000; i++) {
queue.push(i);
}
queue.clear();
cout << "Test time: " << (int)(timeGetTime() - time1) << " milliseconds" << endl;
Veuillez donner plus d'informations. Quelles opérations voulez-vous typiquement faire? Quelle est la taille de votre ensemble de données? Quelles données voulez-vous stocker dans le conteneur? Il n'y a pas un seul conteneur qui soit le meilleur dans tous les cas, vous devez donc en choisir un qui convient à ce que vous voulez faire. –
J'ai édité la question, et je me rends compte qu'il n'y a rien de mieux dans tous les cas, j'essaie juste de trouver un meilleur algorithme que la méthode d'effacement linéaire. Je peux spécialiser la file d'attente pour plus de réglage en fonction du type de données, mais je suppose que cela devrait fonctionner comme dans le cas des types de données primitifs. – SimpleButPerfect
Avez-vous déterminé que std: queue n'est pas assez rapide pour vos besoins? –
kenny