본문 바로가기

공부하자/Unreal4

[Ue4] TArray 정리

정의

 

TArray<int32> IntArray;

 

배열 만들고 채우기

 

1. Init

IntArray.Init(10, 5);
// IntArray == [10,10,10,10,10]

2. Add, Emplace

TArray<FString> StrArr;
StrArr.Add    (TEXT("Hello"));
StrArr.Emplace(TEXT("World"));

 

Add , Emplace 차이

Add는 앨리먼트 유형의 인스턴스를 배열에 복사

Emplace는 지정한 인수를 사용하여 엘리먼트 유형의 인스턴스를 새로 생성

 

성능: Emplace > Add

Emplace는 호출되는 곳에 임시 생성 후 컨테이너에 복사 내지 이동하는 불필요한 절차를 피할수 있다.

 

3. Append

FString Arr[] = { TEXT("of"), TEXT("Tomorrow") };
StrArr.Append(Arr, ARRAY_COUNT(Arr));
// StrArr == ["Hello","World","of","Tomorrow"]

4. AddUnique

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

StrArr.AddUnique(TEXT("!"));
// StrArr is unchanged as "!" is already an element

5. Insert

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

6. SetNum

StrArr.SetNum(8);
// StrArr == ["Hello","Brave","World","of","Tomorrow","!","",""]
StrArr.SetNum(6);
// StrArr == ["Hello","Brave","World","of","Tomorrow","!"]

 

반복 처리

 

1.

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

2.

for (int32 Index = 0; Index != StrArr.Num(); ++Index)
{
    JoinedStr += StrArr[Index];
    JoinedStr += TEXT(" ");
}

3.

for (auto It = StrArr.CreateConstIterator(); It; ++It)
{
    JoinedStr += *It;
    JoinedStr += TEXT(" ");
}

 

 

소팅

 

1. Sort

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"]

2. HeapSort

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

3. StableSort (기존 사전식 소팅 이후 상대 순서가 유지)

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

 

쿼리

 

1. Find

int32 Index;
if (StrArr.Find(TEXT("Hello"), Index))
{
    // Index == 3
}

2. FindLast

int32 IndexLast;
if (StrArr.FindLast(TEXT("Hello"), IndexLast))
{
    // IndexLast == 3, because there aren't any duplicates
}

3. IndexOfByKey

int32 Index = StrArr.IndexOfByKey(TEXT("Hello"));
// Index == 3

4. IndexOfByPredicate

int32 Index = StrArr.IndexOfByPredicate([](const FString& Str){
    return Str.Contains(TEXT("r"));
});
// Index == 2

 

제거

 

1. Remove

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]

2. RemoveSingle

ValArr.RemoveSingle(30);
// ValArr == [10,5,10,15,25,30]

3. RemoveAt

ValArr.RemoveAt(2); // 인덱스 2 엘리먼트를 제거합니다
// ValArr == [10,5,15,25,30]

ValArr.RemoveAt(99); // 런타임 오류가 발생합니다
                       // 인덱스 99 에 엘리먼트가 없기 때문입니다

4. RemoveAll

ValArr.RemoveAll([](int32 Val) {
    return Val % 3 == 0;
});
// ValArr == [10,5,25]

4. Empty

ValArr2.Empty();
// ValArr2 == []

 

참조: https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TArrays/