본문 바로가기
::protected/언리얼4&5

TArray

by 해맑은욱 2019. 10. 17.

언리얼 엔진의 가장 간단한 배열 컨테이너.

// 배열 만들기
TArray<int32> IntArray;
IntArray.Init(10, 5); // IntArray == [10,10,10,10,10]

TArray<FString> StrArr;
// Add(Push)는 엘리먼트 유형의 인스턴스를 배열에 복사(이동). int, float 같은 기본형식.
StrArr.Add(TEXT("Hello"));
// Emplace는 지정한 인수를 사용하여 엘리먼트 유형의 인스턴스를 새로 생성. fstring. data.
StrArr.Emplace(TEXT("World")); // StrArr == ["Hello","World"]

// Append는 다수의 엘리먼트를 한꺼번에 추가.
FString Arr[] = { TEXT("of"), TEXT("Tomorrow") };
StrArr.Append(Arr, ARRAY_COUNT(Arr)); // StrArr == ["Hello","World","of","Tomorrow"]

// AddUnique 동일한 엘리먼트가 이미 존재하지 않는 경우 새 엘리먼트만 추가.
StrArr.AddUnique(TEXT("!")); // StrArr == ["Hello","World","of","Tomorrow","!"]
StrArr.AddUnique(TEXT("!")); // StrArr is unchanged as "!" is already an element

StrArr.Insert(TEXT("Brave"), 1); // StrArr == ["Hello","Brave","World","of","Tomorrow","!"]

// SetNum 함수는 배열의 크기를 설정. 현재보다 크면 생성. 작으면 제거.
StrArr.SetNum(8); // StrArr == ["Hello","Brave","World","of","Tomorrow","!","",""]

// 범위 for문 사용.
FString JoinedStr;
for (auto& Str : StrArr)
{
    JoinedStr += Str;
    JoinedStr += TEXT(" ");
}
// JoinedStr == "Hello Brave World of Tomorrow ! "

// CreateIterator, CreateConstIterator 사용.
for (auto It = StrArr.CreateConstIterator(); It; ++It)
{
    JoinedStr += *It;
    JoinedStr += TEXT(" ");
}

// 소팅.
StrArr.Sort(); // StrArr == ["!","Brave","Hello","of","Tomorrow","World"]
StrArr.Sort([](const FString& A, const FString& B) {
    return A.Len() < B.Len();
});
// StrArr == ["!","of","Hello","Brave","World","Tomorrow"]

// 엘리먼트 개수.
int32 Count = StrArr.Num(); // Count == 6

// 유효하지 않은 인덱스 확인.
bool bValidM1 = StrArr.IsValidIndex(-1); // false
bool bValid0  = StrArr.IsValidIndex(0); // true("!")

// 배열에 특정 엘리먼트가 있는지 확인.
bool bHello   = StrArr.Contains(TEXT("Hello")); // bHello   == true
bool bGoodbye = StrArr.Contains(TEXT("Goodbye")); // bGoodbye == false

// Find 함수로 엘리먼트 찾기.
int32 Index;
if (StrArr.Find(TEXT("Hello"), Index))
{
    // Index == 3; StrArr == ["!","of","Hello","Brave","World","Tomorrow"]
}

// 중복된 엘리먼트의 마지막 엘리먼트 인덱스 찾기.
int32 IndexLast;
if (StrArr.FindLast(TEXT("Hello"), IndexLast))
{
    // IndexLast == 3, because there aren't any duplicates
}

// IndexOfByKey 함수로 찾기. 없으면 INDEX_NONE 반환
int32 Index = StrArr.IndexOfByKey(TEXT("Hello")); // Index == 3

// FindByKey 함수로 찾기. 포인터 반환. 없으면 nullptr 반환.
auto* OfPtr  = StrArr.FindByKey(TEXT("of"))); // OfPtr  == &StrArr[1]
auto* ThePtr = StrArr.FindByKey(TEXT("the"))); // ThePtr == nullptr

// 제거.
TArray<int32> 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]
ValArr.RemoveAt(2); // 인덱스 2 엘리먼트를 제거. ValArr == [10,30,10,15,25,30]

TArray<int32> ValArr2;
for (int32 i = 0; i != 10; ++i)
    ValArr2.Add(i % 5); // ValArr2 == [0,1,2,3,4,0,1,2,3,4]

// Swap으로 제거.
ValArr2.RemoveSwap(2); // ValArr2 == [0,1,4,3,4,0,1,3]
ValArr2.RemoveAtSwap(1); // ValArr2 == [0,3,4,3,4,0,1]
ValArr2.RemoveAllSwap([](int32 Val) {
    return Val % 3 == 0;
}); // ValArr2 == [1,4,4]

// 배열 모두 제거.
ValArr2.Empty(); // ValArr2 == []
 

'::protected > 언리얼4&5' 카테고리의 다른 글

TSet  (0) 2019.10.17
TMap  (0) 2019.10.17
스트링 처리  (0) 2019.10.17
델리게이트  (0) 2019.10.17
프로퍼티  (0) 2019.10.17