2017-10-05 9 views
1

De nombreuses langues ont un type de file d'attente (http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html); Je suis même incapable de trouver une bibliothèque qui implémente un type de file d'attente (structure de données premier entré, premier sorti). Le manque de file d'attente me surprend. Existe-t-il une manière différente que D fasse une file d'attente?Type de file d'attente dans D?

La syntaxe je pense serait semblable à ceci:

//To create 
Queue!string queue = new Queue!string; 

//To add 
queue.add("value"); 

//To access 
string value = queue.get; //will remove from queue 
//or 
foreach (string value; queue) {} 

Comment procéderait-il à D? Ou devrai-je le mettre en œuvre moi-même?

Répondre

2

Les conteneurs actuellement dans la bibliothèque standard de D se trouvent dans std.container. Ils sont un peu clairsemés. Une refonte de ceux-ci est en cours, mais cela fait un moment maintenant, et qui sait quand cela sera fait. Donc, malheureusement, la bibliothèque standard de D est un peu faible dans le domaine des conteneurs. Cela étant dit, vous pouvez utiliser std.container.dlist.DList pour une file d'attente. C'est une liste doublement chaînée, qui est généralement la façon dont les files d'attente sont implémentées en interne, même si ce n'est pas l'API qu'elles exposent. En outre, http://code.dlang.org a plusieurs paquets avec des conteneurs.

Mais je suggère de commencer par DList et de voir comment cela fonctionne bien pour ce dont vous avez besoin. Cela devrait fonctionner correctement si vous recherchez une file d'attente de base. Il suffit d'utiliser insertBack pour mettre les choses à la fin, front pour obtenir le premier élément, et removeFront pour supprimer les éléments du recto. Et si vous voulez une API qui force une file d'attente, vous pouvez simplement envelopper un DList dans votre propre type.

+1

Vous pouvez également le faire assez trivialement avec un tableau simple. Vous pouvez même le faire efficacement avec un tableau et un couple de méthodes d'aide; moins de 20 lignes de code. –

+0

C'était ce dont j'avais besoin. Je ne pouvais pas trouver de bibliothèque auparavant, mais je ne savais pas trop comment la bibliothèque pouvait être appelée. @ AdamD.Ruppe Oui c'était ce que je pensais que je devrais faire mais j'étais sûr qu'il y aurait un meilleur moyen avec moins de réaffectations de mémoire. Je n'ai jamais su comment les files d'attente au niveau bas étaient implémentées. Listes doublement chaînées (https://en.wikipedia.org/wiki/Doubly_linked_list) –

+0

La façon dont je le ferais est un tableau circulaire (qui pourrait même être de taille statique). Comme 'ubyte start, end; T [256] file d'attente; void add_to_queue (T t) {queue [fin ++] = t; } T remove_from_queue() {return queue [début ++]; } 'Vous voudriez vraiment nettoyer certains bords bruts (comme peut-être vérifier si start == end, il est vide), mais ce code fonctionnerait plutôt bien pour beaucoup de choses, est vraiment simple, et n'a pas de réallocations de mémoire du tout. –