TDoubleLinkedList

¾ð¸®¾óÀÇ TDoubleLinkedList ÄÁÅ×À̳ʿ¡ ´ëÇØ ¾Ë¾Æ º¸ÀÚ

TDoubleLinkedList¿¡ ³ëµå Ãß°¡½Ã ¸Þ¸ð¸® ÇÒ´ç ¹× ÇØÁ¦´Â new¿Í delete·Î ÇÑ´Ù.

Çì´õ ÆÄÀÏ
USTRUCT(BlueprintType)
struct FMyStruct
{
    GENERATED_BODY()
public:
    FMyStruct();
    ~FMyStruct();
    UPROPERTY()
    FString Name;
    UPROPERTY()
    int id = 0;
};

UCLASS()
class UMGLISTVIEWDEMO_API AUmgListViewDemoGameModeBase : public AGameModeBase
{
    GENERATED_BODY()

......
protected:
    TDoubleLinkedList<FMyStruct*> MyStructList;
};

CPP ÆÄÀÏ
FMyStruct::FMyStruct()
{
    //UE_LOG(LogTemp, Warning, TEXT("%p, %s (%d)"), this, *FString(__FUNCTION__), __LINE__);
}

FMyStruct::~FMyStruct()
{
    //UE_LOG(LogTemp, Warning, TEXT("%p, %s (%d)"), this, *FString(__FUNCTION__), __LINE__);
}

//³ëµå °Ë»ö

TDoubleLinkedList<FMyStruct*>::TDoubleLinkedListNode* FindMyStruct(const TDoubleLinkedList<FMyStruct*>& list, int id)
{
    TDoubleLinkedList<FMyStruct*>::TDoubleLinkedListNode* Node = list.GetHead();
    while (Node != nullptr)
    {
        if (Node->GetValue()->id == id)
        {
            break;
        }

        Node = Node->GetNextNode();
    }

    return Node;
}

//³ëµå Ãß°¡
void AddMyStruct(TDoubleLinkedList<FMyStruct*>& MyList, const FString& Name, int Id)
{
    FMyStruct* My = new FMyStruct();
    My->Name = Name;
    My->id = Id;
    MyList.AddTail(My);
}

//³ëµå »ðÀÔ
void InsertMyStruct(TDoubleLinkedList<FMyStruct*>& MyList, const FString& Name, int Id, int FindKey)
{
#if 0 
    //FindMyStruct·Î Ãß°¡
    TDoubleLinkedList<FMyStruct*>::TDoubleLinkedListNode* fNode = FindMyStruct(MyList, FindKey);
    if (fNode)
    {
        FMyStruct* My = new FMyStruct();
        My->Name = Name;
        My->id = Id;
        MyList.InsertNode(My, fNode);
    }
#else
    for (TDoubleLinkedList<FMyStruct*>::TIterator Itr(MyList.GetHead()); Itr; ++Itr)
    {
        if (*Itr && (*Itr)->id == FindKey)
        {
            FMyStruct* My = new FMyStruct();
            My->Name = Name;
            My->id = Id;
            MyList.InsertNode(My, Itr.GetNode());
            break;
        }
    }
#endif
}

//¸ðµå ³ëµå Á¦°Å
void RemoveAllMyStruct(TDoubleLinkedList<FMyStruct*>& MyList)
{
    //»èÁ¦Àü¿¡ ¸Þ¸ð¸® ÇØÁ¦
    for (TDoubleLinkedList<FMyStruct*>::TIterator Itr(MyList.GetHead()); Itr; ++Itr)
    {
        if (*Itr)
        {
            FMyStruct* rnode = *Itr;
            delete rnode;
        }
    }

    MyList.Empty();
}

//³ëµå Ãâ·Â
void PrintMyStruct(const TDoubleLinkedList<FMyStruct*>& MyList)
{
    for (TDoubleLinkedList<FMyStruct*>::TIterator Itr(MyList.GetHead()); Itr; ++Itr)
    {
        if (*Itr)
        {
            FPlatformMisc::LowLevelOutputDebugStringf(TEXT("id=%d, %s\n"), Itr->id, *(Itr->Name));
        }
    }
}

//»ðÀÔÁ¤·Ä Çϸ鼭 Ãß°¡ Çϱâ
void InsertSortMyStruct(TDoubleLinkedList<FMyStruct*>& MyList, const FString& Name, int Id)
{
    if (MyList.Num() == 0)
    {
        AddMyStruct(MyList, Name, Id);
        return;
    }

    for (TDoubleLinkedList<FMyStruct*>::TIterator Itr(MyList.GetHead()); Itr; ++Itr)
    {
        if (*Itr == nullptr)
            continue;

        int key = (*Itr)->id;
        if (Id <= key)
        {
            FMyStruct* My = new FMyStruct();
            My->Name = Name;
            My->id = Id;
            MyList.InsertNode(My, Itr.GetNode());
            return;
        }
    }

    AddMyStruct(MyList, Name, Id);
}

CPP  Å×½ºÆ®: ¸Þ¸ð¸® ÇØÁ¦°¡ Àߵǰí ÀÖ´ÂÁö üũ
//TDoubleLinkedList Ãß°¡, °Ë»ö, »ðÀÔ, ¸ðµÎ »èÁ¦(¸Þ¸ð¸® ÇØÁ¦) Å×½ºÆ®
AddMyStruct(MyStructList, TEXT("aaa"), 1);
AddMyStruct(MyStructList, TEXT("ccc"), 3);

FMyStruct fff;
fff.Name = TEXT("xxx");
fff.id = 3;
//TDoubleLinkedList<FMyStruct*>::TDoubleLinkedListNode* nodePtr1 = MyStructList.FindNode(My2);  //¸ðµç °ªÀÌ °°¾Æ¼­ ´ç¿¬È÷ ã´Â´Ù
TDoubleLinkedList<FMyStruct*>::TDoubleLinkedListNode* nodePtr2 = MyStructList.FindNode(&fff);   //NameÀÌ ´Þ¶ó¼­ nullptrÀÌ´Ù. operator== ¿¬»êÀÚ Àû¿ë ¾ÈµÈ´Ù.
TDoubleLinkedList<FMyStruct*>::TDoubleLinkedListNode* nodePtr3 = FindMyStruct(MyStructList, fff.id);

InsertMyStruct(MyStructList, TEXT("bbb"), 2, 3);

RemoveAllMyStruct(MyStructList);

CPP Å×½ºÆ®: »ðÀÔ Á¤·Ä Å×½ºÆ®
InsertSortMyStruct(MyStructList, TEXT("aaa"), 1);
InsertSortMyStruct(MyStructList, TEXT("fff"), 5);
InsertSortMyStruct(MyStructList, TEXT("ccc"), 3);
InsertSortMyStruct(MyStructList, TEXT("bbb"), 2);
InsertSortMyStruct(MyStructList, TEXT("ddd"), 4);
InsertSortMyStruct(MyStructList, TEXT("ddd111"), 4);

PrintMyStruct(MyStructList);
RemoveAllMyStruct(MyStructList);

Âü°í)
https://dawnarc.com/2020/02/ue4c-container-notes/
https://ikrima.dev/ue4guide/engine-programming/useful-classes/