2017-10-05 7 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) {큐 [end ++] = t; } T remove_from_queue() {대기열 반환 [시작 ++]; }'당신은 약간의 거친 가장자리를 깨끗하게 정리하고 싶을 것입니다. (시작 == 끝, 비어 있는지 확인하십시오.)하지만 실제로 많은 일에 대해 꽤 잘 작동하고, 정말 간단하며, 아무 것도 없습니다. 메모리 재 할당. –