고급 스토리지

Collectathon에서 실현된 각종 데이터 구조를 토론할 때 가장 좋은 출발점은 가장 간단하다.기본 구성 요소에 익숙하지 않으면, 트리가 어떻게 다중 트리의 변체인지 설명하고, 다중 트리 자체가 동적으로 크기를 조정하는 수조를 사용하여 각 피드 인용을 저장하는 것은 무의미합니다.무엇이 절대적으로 가장 기본적인 데이터 구조입니까?언어에서 직접 이루어지는 것을 무시한다. 예를 들어 class 또는 struct 는 수조가 될 것이다.모든 그룹 중 가장 기본적인 그룹, 즉 고정된 크기의 그룹을 잘 알고 있습니다. 왜냐하면 거의 모든 프로그래밍 언어에서 Int32[] 쓰기 쉽기 때문입니다.그러나 당신은 더 높은 행위가 실제로는 여전히 하나의 수조의 기초 위에서 실현될 수 있다는 것을 알고 있습니까?

BoundedArray<TElement> 및 BoundedArray<TIndex,TElement>


나는 두 가지 유형을 동시에 소개할 것이다. 이것은 대다수 시리즈의 전체적인 추세가 될 것이다.왜?두 사람의 행위 방식이 완전히 같기 때문에 유일한 차이는 하나는 관련이 있고 다른 하나는 그렇지 않다는 것이다.

결합성


그나저나 연관성에 익숙하지 않다면, 새로운 학습자가 특히 사용하기 어렵다는 것을 알려주기 때문에, 연관성은 요소가 특정한 색인을 가진 집합에 입력되는 것을 의미할 뿐이다.나는 몇 가지 예를 들어 이 점을 설명할 것이다.

경계


테두리란 최대 테두리 또는 크기를 갖는 패턴을 가리키며 용량이라고도 하지만 이 테두리 아래에서 자유롭게 크기를 조정할 수 있습니다.이것은 표준 고정 크기 그룹과 구별되는 특징입니다. 왜냐하면 그것은 5개의 원소로 구성된 수조가 아니라 0, 1, 2, 3, 4 또는 5개의 원소가 될 수 있는 수조이기 때문입니다!SQL을 자주 사용하는 경우 SQL 문자 필드가 경계 그룹임을 인식해야 합니다.

활용단어참조


우선 BoundedArray<TElement> 를 봅시다. 왜냐하면 그것은 더욱 직접적이기 때문입니다.
고정된 크기의 그룹에 비해 하나의 그룹을 성명하고 구성하는 것은 어떻습니까?
public readonly Int32[] fixedArray =
    new Int32[] { 1, 2, 3, 4, 5 };
public readonly BoundedArray<Int32> boundedArray =
    new BoundedArray<Int32>(5) { 1, 2, 3, 4, 5 };
비슷해 보이는데, 이런 것들이 거의 같은 일이라는 것을 감안하면 일리가 있을 것이다.근데 다른 거 보여달라고.BoundedArray<TElement> 스탠드 Implicit(TElement[] to BoundedArray<TElement>) .
public readonly BoundedArray<Int32> boundedArray =
    new Int32[] { 1, 2, 3, 4, 5 };
사실상, 모든 고정된 크기의 수조는 경계 크기의 수조를 만들 수 있다. 왜냐하면 우리는 그것을 만드는 데 필요한 모든 정보를 가지고 있기 때문이다.
고정된 그룹에서 원하는 모든 구성원을 지원하는 경계 그룹이 있다는 것을 알게 되어 기쁩니다.
Assert.Equal(3, boundedArray[2]);
Assert.Equal(new[] { 1, 2, 3 }, boundedArray[0..2]);
Assert.Equal(5, boundedArray.Length);
등등
그렇다면 왜 고정수조가 아닌 경계수조를 사용해야 합니까?이 모든 것은 유계수 그룹이 제공하는 추가 유연성에 귀결된다.고정 어레이에 전혀 없는 작업을 고려하십시오.
boundedArray.Remove(5); // Remove every 5
boundedArray.Remove((x) => x % 2 == 0); // Remove every even
// boundedArray is now: [1, 3]
boundedArray.Add(4);
// boundedArray is now: [1, 3, 4]
boundedArray.Insert(1, 2);
// boundedArray is now: [1, 2, 3, 4]
참고 스토리지가 최대 용량인 경우 요소를 추가하거나 삽입하면 예외가 발생합니다!
그중 BoundedArray<TIndex, TElement> 의 차이점은 그것이 관련되어 있기 때문에 우리는 이미 알고 있는 색인 유형을 가지게 되었다.시공 고려:
public readonly BoundedArray<Char, String> boundedArray =
    new BoundedArray<Char, String>(5);
이 예에서, 우리는 수조의 초기 값 설정 항목을 사용할 수 있으며, 우리가 (Char, String)[] 수조를 가지고 있다고 가정할 수 있다. Zip() 를 호출하여 길이가 같은 두 개의 그룹을 이 그룹에 연결할 수 있지만, 이렇게 지정할 수도 있습니다.
new BoundedArray<Char, String>(5) {
    ('a', "Alfa"),
    ('b', "Bravo"),
    ('c', "Charlie"),
    ('d', "Delta"),
    ('e', "Echo"),
};
그리고 관련 집합에 대해 우리가 TIndex 유형과 파라미터를 현저하게 전달하기 때문에 당신은 그것을 사용할 수 있습니다. 당신은 알고 있습니다. 색인.
Assert.Equal("Bravo", boundedArray['b']);
Assert.Equal("Echo", boundedArray['e']);
Assert.Equal(null, boundedArray['f']); // Not in the collection, returns default
이것 또한 관련 변수를 희소수 그룹으로 사용할 수 있음을 의미합니다. Int32 또는 다른 정수 형식을 색인으로 사용할 수 있습니다!
유계수조의 장점은 상당히 높은 유연성을 제공했고 복잡성을 어느 정도 실현하지 못했다는 것이다.사실상 데이터 구조의 추가 정수에만 의존하고 화려한 논리는 절대 없다.
계수조의 단점은 실제 메모리를 얼마나 사용하든지 간에 메모리 중의 최대 용량을 다 쓴다는 것이다.너는 다른 선택이 없다.매우 크고 작은 어레이가 필요할 수 있습니까?어쨌든 너는 반드시 가장 큰 용량을 사용해야 한다.이것은 좋지 않다. 이것은 다음과 같은 방면의 발전을 초래했다.

DynamicArray<TElement>와 DynamicArray<TIndex,TElement>


믿거나 말거나 우리는 이미 어느 정도 전시해야 할 모든 것을 보여 주었다.그렇다면 동적 크기의 진열은 어떻게 다릅니까?이것은 결국 그 내부에서 무엇을 하고 있는가 하는 것이다.만부하 시 요소를 추가하거나 삽입하면 경계 크기 그룹은 이상을 일으키고, 동적 크기 그룹은 매우 다른 일을 한다.그들은 성장하고 있다!이 조작 효율은 매우 낮다. 만약 당신이 많은 사이즈를 바꾸고 싶다면, 다른 더 적합한 집합도 있다.그러나 용량이 더 큰 새 그룹을 만들고, 원소를 복제하고, 내부 인용을 교환하고, 낡은 그룹을 버려서 이 점을 실현한다.이 모든 것을 다 해 주었어!동적 크기 그룹은 확실히 그것들의 용례가 있고 내부에서 많이 사용되지만, 일반적으로 목록이나 트리가 필요합니다.만약 크기 변경이 보기 드문 일이라는 것을 알고 있다면, 동적 진열이 바로 당신이 필요로 하는 것일 수도 있습니다.
이것은 완전하고 언제든지 사용할 수 있는 데이터 구조이지만 다음과 같은 더 많은 내용에 관심을 가질 수 있습니다.

그룹 <TElement, TSelf> 및 그룹 <TIndex,TElement, TSelf>


Collectathon는 하나의 집합 라이브러리일 뿐만 아니라 하나의 프레임워크이기 때문에 우리는 프레임워크 유형의 작업 방식과 당신이 원한다면 어떻게 그것들을 사용하여 다른 행동을 추가하는지 깊이 이해해야 한다.이 두 가지 변체 중, 그것은 모두 유형이 단지 어떤 수조일 뿐이라고 가정한다.그러나 이것은 여전히 실현자에게 많은 것을 제공했다. 예를 들어 정방향과 역방향 매거기(예, Collectathon는 그것을 지원하는 모든 유형에서 역방향 매거기를 지원합니다), 인덱스와 슬라이더, 같은 방법과 연산자, 원소 교체, 위치 이동 등이다."그것은 어떤 수조"외에도 많은 다른 기능들이 가설할 수 없다.
만약 CRTP에 익숙하지 않다면, TSelf 매개 변수는 단지 "헤이, 실현 유형을 나에게 전달해 주십시오. 왜냐하면 나는 그것을 사용하여 당신에게 물건을 제공할 것입니다."라고 말할 뿐입니다.기본적으로 프레임워크에서 더 많은 정보를 무료로 얻을 수 있습니다.
하지만 우리는 더 멀리 갈 수 있어!

FlexibleArray<TElement, TSelf> 및 FlexibleArray<TIndex,TElement, TSelf>


유계수조와 동적수조는 모두 이로부터 파생된다.그것은 이러한 가설을 추가했다. "이 수조는 크기를 조정할 수 있지만, 나는 그것의 한계성과 메커니즘을 모른다."
이 가설은 네가 상상한 것보다 훨씬 많다.요소 삽입, 전체 그룹 지우기, 대기열, 스택 동작, 요소 삭제는 자동으로 제공됩니다.사실 이 점에 이르러도 너무 많은 DynamicArray<TElement 을 정의하고 실현하기만 하면...4가지 방법!아니, 정말이야!

프레임을 모으는 것이 이렇게 효과적이다.

좋은 웹페이지 즐겨찾기