목록Unreal스터디/TArray (20)
그냥 게임개발자
슬랙 보통 메모리를 우리가 확보를 해야 배열을 만들 수 가 있는데 요소를 추가할 때마다 메모리를 하나씩 늘려서 확보하는 작업에 대한 오버헤드가 생기기 때문에 보통은 요청하는 것보다 넉넉한 메모리를 확보해서 그 다음에 데이터를 넣는 방식으로 진행이 된다. 그렇기 때문에 엘리먼트를 삭제한다고 해도 메모리가 바로 해지되지는 않는다. Slack이라는 것은 여유분이다. 사용하지 않아도 사실상 미리 할당된 엘리먼트 저장 슬롯을 남겨주는 것이 효과적이라는 뜻이다. 그런데 이것이 계속해서 남아있으면 불필요한 낭비가 될 수가 있기에 남아있는 것들 조차도 다 제거해서 깔끔하게 정리를 할 수 있다. 문서 내용 배열은 크기변경이 가능하므로, 메모리 사용량이 가변적이다.배열이 추가될 때마다 매번 재할당을 피하기 위해, 얼로케이..

힙 TArray에는 이진 힙 데이터 구조체를 지원하는 함수가 있다. 힙은 부모 노드가 그 자손 노드 전부의 이전 또는 동등한 위치에 있는 이진트리 유형이다. 배열로 구현되면, 트리의 루트노드는 엘리먼트 0이며, N 인덱스 노드의 좌우 자손 인덱스는 각각 2N+1 과 2N + 2이다. Heapify 함수를 사용하여 기존 배열을 힙으로 변환시킬 수 있다. 술부가 있을 수도 없을 수도 있는데, 술부가 없는 버전은 순서 결정에 엘리먼트 유형의 연산자 < 를 사용 TArray HeapArr; for (int32 Val = 10; Val != 0; --Val) HeapArr.Add(val); // HeapArr == [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] HeapArr.Heapify(); // H..
연산자 배열은 일반적인 값 유형으로, 일반적인 생성자 복사나 할당 연산자를 통해 복사할 수 있다. 배열은 엘리먼트를 엄격히 소유하기에, 배열을 복사하면 '깊이'가 있어, 새 배열에는 자체적인 엘리먼트 사본이 생김 TArray ValArr3; ValArr3.Add(1); ValArr3.Add(2); ValArr3.Add(3); auto ValArr4 = ValArr3; // 복사 시작 // ValArr4 == [ 1, 2, 3 ]; ValArr4[0] = 5; // ValArr3 == [ 1. 2. 3 ]; // ValArr4 == [ 5, 2, 3 ]; Append 함수의 대안으로, operator += 를 통해 배열을 연결시킬 수 있다. ValArr4 += ValArr3; // ValArr4 == [ ..
제거 일단 제거는 인서트와 마찬가지로 배열에서 엘리먼트를 지우는데 있어 전체적으로 데이터 변동이 일어나기 때문에 그렇게 효율은 좋지 않다고 볼 수 있다. Remove 배열에서 엘리먼트를 지울 수 있다. operator==에 따라 제공한 것과 동일한 것으로 간주되는 엘리먼트를 모두 지운다. TArray ValArr; int32 Temp[] = { 10, 20, 30, 5, 10, 15, 20, 25, 30 }; ValArr.Append(Temp, ARRAY_COUNT(Temp)); // ValArr == [10, 20, 30, 5, 10, 15, 20, 25, 30] ValArr.Remove(20); // ValArr == [10, 30, 5, 10, 15, 25, 30] RemoveSingle 배열에서 ..
FilterByPredicate 특정 술부에 일치하는 엘리먼트의 배열을 가져온다. auto Filter = StrArray.FilterByPredicate([](const FString& Str) { return !Str.IsEmpty() && Str[0] < TEXT('M'); });
IndexOfByPredicate 지정된 술부에 일치하는 첫 엘리먼트 인덱스를 찾는 데 사용할 수 있으며, 찾은 것이 없으면 마찬가지로 특수 INDEX_NONE값을 반환 int32 Index = StrArr.IndexOfByPredicate([](const FString& Str) { return Str.Contains(TEXT("r")); }); // Index == 2 인덱스 반환 대신, 찾은 엘리먼트로의 포인터를 반환할 수도 있다. FindByKey는 엘리먼트를 임의 오브젝트에 비교하는 식으로 IndexOfByKey 처럼 작동하나, 찾은 엘리먼트가 있으면 그 포인터를 , 없으면 nullptr를 반환한다. auto* OfPtr = StrArr.FindByKey(TEXT("of")); auto* The..
IndexOfByKey 이것도 비슷하게 작동하지만, 엘리먼트와 임의 오브젝트의 비교가 가능하다. Find 함수로는 검색 시작 전 인수를 엘리먼트 유형(이 경우 FString)으로 실제 변환한다. IndexOfByKey 함수로는 키 비교를 바로 하여, 키 유형을 엘리먼트 유형으로 직접 변환할 수 없을 때에도 검색이 가능 IndexOfByKey 는 operator==(ElementType, KeyType)가 존재하는지 키 유형에 대해 작동한다. IndexOfByKey는 처음 찾은 엘리먼트의 인덱스 또는 찾은 것이 없으면 INDEX_NONE을 반환한다. int32 Index = StrArr.IndexOfByKey(TEXT("Hello")); // Index == 3
Index 처음 찾은 엘리먼트의 인덱스로 설정된다. 중복된 엘리먼트가 있는 상태에서 마지막 엘리먼트의 인덱스를 찾고자 하는 경우, FindLast 함수를 대신 사용하면 된다. int32 IndexLast; if (StrArr.FindLast(TEXT("Hello"), IndexLast)) { // IndexLast == 3, 하지만 중복되지 않음 } 이 두함수 모두 엘리먼트를 찾았는지 여부를 나타내는 부울 값을 반환하면서, 찾았을 경우 그 엘리먼트의 인덱스 값을 변수에 쓰기도 한다. Find와 FindLast는 엘리먼트 인덱스를 직접 반환할 수도 있다. 인덱스를 명시적 인수로 전달하지 않으면 그렇게 한다. int32 Index2 = StrArr.Find(TEXT("Hello")); int32 IndexL..