2017-10-05 120 views
1

許多語言都有隊列類型(http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html);我甚至找不到實現隊列類型的庫(先進先出數據結構)。缺少排隊令我感到驚訝。 D有排隊的方式嗎?D中的隊列類型?

我希望會是類似這樣的語法:

//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) {} 

這將如何保存在d做了什麼?或者我需要自己實施它嗎?

回答

2

當前位於D標準庫中的容器位於std.container中。雖然它們有點稀疏。他們正在進行重新設計,但現在已經有一段時間了,誰知道什麼時候會完成。所以,不幸的是,D的標準庫在容器領域有點弱。話雖如此,你可以使用std.container.dlist.DList作爲隊列。這是一個雙向鏈接列表,通常是如何在內部實現隊列,即使這不是他們公開的API。

或者,http://code.dlang.org有幾個容器包。

但我建議從DList開始,看看它的工作效果如何,你需要什麼。如果你正在尋找一個基本的隊列,它應該工作得很好。只需使用insertBack即可完成任務,front可獲得第一個元素,removeFront可從前面刪除物品。如果你想要一個強制隊列的API,你可以用你自己的類型包裝一個DList

+1

你也可以用一個簡單的數組來完成它。你甚至可以用數組和輔助方法高效地完成它;少於20行的代碼。 –

+0

這就是我需要的。我以前找不到圖書館,但我想我不確定圖書館可能會被稱爲什麼。 @ AdamD.Ruppe是的,雖然我可能不得不這樣做,但我確信有更少的內存重新分配會有更好的方式。我從來不知道如何實現低級別的隊列。雙鏈表! (https://en.wikipedia.org/wiki/Doubly_linked_list) –

+0

我這樣做的方式是一個圓形數組(甚至可能是靜態大小)。像'ubyte開始,結束; T [256]隊列; void add_to_queue(T t){queue [end ++] = t; } T remove_from_queue(){return queue [start ++]; }'你可能會想要清理那些粗糙的邊緣(比如可能檢查start == end,它是空的),但是這些代碼實際上對很多事情來說都很好,非常簡單,並且沒有內存重新分配。 –