2009-03-03 4 views
5

아래쪽/위쪽 경계와 함께 작동하는 이중 링크 목록 (배열 포함)과 비슷한 것을 만들고 싶습니다.C++ - 상한/하한 경계의 원형 배열?

전형적인 원형 배열은 아마과 같습니다

next = (current + 1) % count; 
previous = (current - 1) % count; 

그러나 제대로이에/낮은 상한을 통합하는 수학적 연산은 무엇인가?

  • 0 (하한 항목 1)
  • 1
  • 2 (상한 항목 1)
  • 3 (하한 항목 2)
  • 4 (상한 항목 2)

그래서를 :

- 항목에 대한 인덱스 2> 다음 1 명 0을 반환

,

- 항목에 대한 인덱스 4> 다음이 개 반환 3

- - 1 개 2를 반환

항목에 대한 인덱스 0에> 이전 항목에 대한 인덱스 3> 이전이 개 반환

4 주셔서 감사합니다 !

참고 : 외부 라이브러리를 사용할 수 없습니다.

+0

당신이 당신의 설명을 조금 확장 할 수 있습니다? 순환 대기열의 순환 대기열을 원하는 것처럼 보입니다. 이 경우 각 큐는 별도의 배열에서 더 나을 것입니다. – sfossen

답변

6

:

next === current + 1 (mod count) 
prev === current - 1 (mod count) 

그래서 당신의 최대 3이었다 말 :

어쨌든, 당신은 쉽게 계수를 사용하여 그것의 수학 부분을 달성 할 수 여기서 ===는 '일치하는'연산자입니다. 계수 연산자 이것을 변환, 그것은 다음과 같습니다

count = upper - lower 
next = ((current + 1 - (lower%count) + count) % count) + lower 
prev = ((current - 1 - (lower%count) + count) % count) + lower 

그것은 각 항목에 대한 상위 & 하한을 찾기 위해 당신에게 달려있을 것이다. 이것을 신속하게 검색 할 수 있도록 이진 트리에 저장할 수 있습니다. 어쩌면 내가 당신의 질문을 이해하지 못할 수도 있습니다.

(이 낮은 가정합니다 < 상단 및> 0 이하) 그래서, 당신은 세 멤버 목록을 참조

1

부스트는 Circular container으로 제한을 설정할 수 있다고 생각합니다.

실제로이 페이지의 예제는 여기서 말하는 것과 매우 유사합니다. 일반적으로 수학적 관점에서

int MAX = 3; 
someArray[ 0 % MAX ]; // This would return element 0 
someArray[ 1 % MAX ]; // This would return element 1 
someArray[ 3 % MAX ]; // This would return element 0 
someArray[ 4 % MAX ]; // This would return element 1 
5
  +=======+  +=======+  +=======+ 
      | Obj | ---> | Obj | ---> | Obj | 
buffer | 1 | <--- | 2 | <--- | 3 | 
      +=======+  +=======+  +=======+ 

index  0     1    2  /* our first run */ 

index  3     4    5  /* second run */ 

and so on ... 

, 1 항목 등 0, 3, 6,에 의해 색인마찬가지로, 두 번째 항목은 1, 4 (1 + 3), 7 (4 + 3), ...

일반적인 규칙에 의해 색인입니다 :

curr |  next 
-------+----------------- 
    0 | (0 + 1) % 3 = 1 
-------+----------------- 
    1 | (1 + 1) % 3 = 2 
-------+----------------- 
    2 | (2 + 1) % 3 = 0 
-------+----------------- 

희망이 글을 쓴

3

을하는 데 도움이 우리가 얻을이 공식을 사용하여 next <- (next + 1) % size, size = upper - lower + 1

몇 년 전 원형 STL 반복자에 대해 말합니다.

http://noveltheory.com/Iterators/Iterator_N0.htm

그것은 어떤 STL 컬렉션 작동합니다 (벡터 & 부스트 : 배열, 등)