¾ð¸®¾óÀÇ 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/ |