インターフェイスは次のようになります
template <class T, class Pred>
void downheap (std::vector<T>& heap_vector, unsigned int startingIndex, Pred predicateFunc);
startingIndexがベクトル内のkにある場合、ヒープ内の左側の子はインデックス(2 * k) に配置され、ヒープ内の右側の子はインデックス((2 * k )+ 1)に配置されます。基本的に、述語関数によって指定された順序が満たされるまで、項目をヒープ内の適切な子と比較 (および必要に応じて交換) する必要があります。
述語は、より大きい、より小さい、または任意のカスタム シーケンスである可能性があります...
そのような方法を実装する際に、インデックス アクセスがサイズ制限内であることをどのように確認しますか? つまり 、 heap_vector[rightChildIndex]またはheap_vector[leftChildIndex]は、ループして比較を行っているときにheap_vector.size()-1を超えてはなりません...それは私に少し頭痛の種を与えました
ここに私のコードがあります
while ( pred ( heap_vector[rightChild], heap_vector[parentIndex] ) || pred (
heap_vector[leftChild], heap_vector[parentIndex] ) ) {
if ( pred ( heap_vector[rightChild], heap_vector[leftChild]) ) {
std::swap(heap_vector[parentIndex],heap_vector[rightChild]);
parentIndex=rightChild;
}
else {
std::swap( heap_vector[parentIndex], heap_vector[leftChild]);
parentIndex=leftChild;
}
rightChild= 2*parentIndex+1;
leftChild=2*parentIndex;
if (rightChild>heap_vector.size() || leftChild>heap_vector.size())
break;
}