简单说明
优先队列是用堆排序实现的。存取方法取决于堆排序方法。
TArray里面有堆排序方法,能简单实现TArray类型的堆排序。
Heapify:初始化堆
HeapPush:push元素到堆上
HeapPop:弹出堆顶元素
TArray<int32> openSet;
for (int32 i=0;i<10;i++)
{
openSet.Emplace(UKismetMathLibrary::RandomInteger(100));
}
FString logText = "";
for (int32 i=0;i<openSet.Num();i++)
{
logText.Append(FString::FromInt(openSet[i]));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText %s"),*logText);
openSet.Heapify();
logText = "";
for (int32 i = 0; i < openSet.Num(); i++)
{
logText.Append(FString::FromInt(openSet[i]));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText Heapify %s"), *logText);
openSet.HeapPush(50);
openSet.HeapPush(50);
openSet.HeapPush(50);
openSet.HeapPush(60);
logText = "";
for (int32 i = 0; i < openSet.Num(); i++)
{
logText.Append(FString::FromInt(openSet[i]));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText HeapPush %s"), *logText);
logText = "";
while (openSet.Num()>0)
{
int32 _i = 0;
openSet.HeapPop(_i);
logText.Append(FString::FromInt( _i));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText HeapPop %s"), *logText);
在实际应用中往往不是简单的int推排序,会有更复杂的需求,需要实现更自定义化的堆排序方法以实现优先队列。
参考资料
UE4的TArray(三)
UE – Priority Queue 优先队列
demo
首先需要写两个Struct,一个是TArray的元素,另一个以堆排序规则
//TArray的元素
struct TNode
{
TNode() {
};
TNode(FString _key, int32 _prority) :key(_key), prority(_prority) {
};
int32 prority;
FString key;
};
//TArray的堆排序规则
struct TNodeLess
{
FORCEINLINE bool operator()(const TNode& A, const TNode& B) const
{
return A.prority < B.prority;
}
};
测试代码
//创建一个TNode的数组,并往数组里添加元素
TArray<TNode> openSet;
for (int32 i = 0; i < 10; i++)
{
TNode n(FString::FromInt(i), UKismetMathLibrary::RandomInteger(100));//随机添加优先级
openSet.Emplace(n);
}
//打印原始数组
FString logText = "";
for (int32 i = 0; i < openSet.Num(); i++)
{
logText.Append(openSet[i].key);
logText.Append("-");
logText.Append(FString::FromInt(openSet[i].prority));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText %s"), *logText);
//将数组按照排序规则进行堆排序
openSet.Heapify(TNodeLess());
//打印堆排序之后的元素
logText = "";
for (int32 i = 0; i < openSet.Num(); i++)
{
logText.Append(openSet[i].key);
logText.Append("-");
logText.Append(FString::FromInt(openSet[i].prority));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText Heapify %s"), *logText);
//往数组里堆排序规则添加元素
TNode n1("n1", 50);
TNode n2("n2", 60);
TNode n3("n3", 70);
openSet.HeapPush(n1,TNodeLess());
openSet.HeapPush(n2, TNodeLess());
openSet.HeapPush(n3, TNodeLess());
//打印添加新元素之后的数组
logText = "";
while (openSet.Num() > 0)
{
TNode n;
openSet.HeapPop(n, TNodeLess());//弹出最优先元素
logText.Append(n.key);
logText.Append("-");
logText.Append(FString::FromInt(n.prority));
logText.Append(" ");
}
UE_LOG(LogTemp, Warning, TEXT("===logText HeapPop %s"), *logText);