그냥 게임개발자

TArray - Remove 본문

Unreal스터디/TArray

TArray - Remove

sudoju 2024. 1. 7. 22:18

제거

  • 일단 제거는 인서트와 마찬가지로 배열에서 엘리먼트를 지우는데 있어 전체적으로 데이터 변동이 일어나기 때문에 그렇게 효율은 좋지 않다고 볼 수 있다.

 

Remove

  • 배열에서 엘리먼트를 지울 수 있다.
  • operator==에 따라 제공한 것과 동일한 것으로 간주되는 엘리먼트를 모두 지운다.
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]

 

RemoveSingle

  • 배열에서 처음 일치한 엘리먼트를 지운다.
  • 배열에 중복된 것이 있는데 하나만 지우고자 한다거나, 배열에 해당 엘리먼트가 딱 하나만 있는 것이 확실한 경우 최적화 차원에서 유용
ValArr.RemoveSingle(30);
// ValARr == [10, 5, 10, 15, 25,30]

 

RemoveAt

  • 제거할 엘리먼트를 0 부터 시작하는 인덱스로 지정할 수 있다.
  • IsValidIndex로 배열에 제공하려는 인덱스가 있는지 확인하는 것이 좋은데, 이 함수에 유효하지 않은 인덱스를 전달하면 런타임 오류가 발생하기 때문.
ValArr.RemoveAt(2); // 인덱스 2 엘리먼트를 제거
// ValArr == [10, 5, 15, 25, 30]

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

 

RemoveAll

  • 술부에 일치하는 모든 엘리먼트를 제거할 수 있음.
  • 3의 배수인 값을 전부 제거하려면
ValArr.RemoveAll([](int32 Val) 
{
     return Val % 3 == 0;
});
// ValArr == [10, 5, 25]
  • 이렇게 정리 프로세스에는 비용이 따른다.
  • 엘리먼트가 제거되는 모든 경우에는 그 뒤의 엘리먼트가 낮은 인덱스로 정리되므로, 배열에는 절대 '구멍'이 생길 수 없다.
  • 만약 엘리먼트가 어떤 순서로 남아있든지 신경쓰지 않는다면, RemoveSwap, RemoveAtSwap, RemoveAllSwap 함수를 사용해서 부하를 줄일 수 있다.
  • Swap 없는 버전과의 차이점은 나머지 엘리먼트의 순서를 정리하지 않는다는 점 뿐, 보다 효율적인 구현이 가능
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]
    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]

Empty

  • 배열에서 모든 것을 제거
ValArr2.Empty();
// ValArr2 == []

'Unreal스터디 > TArray' 카테고리의 다른 글

TArray - 힙  (0) 2024.01.07
TArray - 연산자  (0) 2024.01.07
TArray - FilterByPredicate  (0) 2024.01.07
TArray - IndexOfByPredicate  (0) 2024.01.02
TArray - IndexOfByKey  (0) 2024.01.02