オブジェクトのNx
byNy
ベクトルがありますA
。
A
メンバーa
とb
。- メンバー
b
が特定の基準を満たしている場合、それはポインターのベクトルに追加されますheapItem
。 - 次に、この関数
std::make_heap
を使用して最小ヒープを作成します。
次に、私のコードで、ヒープ内のA[i][j].b
presentの値を変更し、ヒープにこれらの変更を反映させたいと思います。
このために、私はfilterUp
とfilterDown
ルーチンを書く必要があります。A[i][j].b
私の問題は、ヒープ内のの場所がわからないことです。trickleUp
&trickleDown
ルーチンを見つける方法や別の方法はありますか?make_heap
コストがかかる可能性があるため、関数を常に呼び出したくありません。
#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
struct A
{
A(){}
A(int av, int bv):a(av),b(bv){}
int a, b;
};
struct MinHeap
{
bool operator()(const A* lhs, const A* rhs) const
{
return lhs->b > rhs->b;
}
};
int main()
{
int Nx=4;
int Ny=3;
int cnt=0;
std::vector<A*> heapItem;
A gridPt[Nx][Ny];
for(int i=0; i<Nx; ++i) // initialize grid of A objects
{
for(int j=0; j<Ny; ++j)
{
gridPt[i][j].a=i*(-j)+2*j+i+j;
gridPt[i][j].b=i+j*(-2)+4;
if(gridPt[i][j].b>0) // add selected A objects to heap
{
heapItem.push_back(&gridPt[i][j]);
cnt++;
}
}
}
std::make_heap(heapItem.begin(), heapItem.end(), MinHeap()); //make heap
gridPt[1][2].b=3; //this object is in heap. need to call a filterUp or filterDown routine to retain min heap structure
int count=0;
for(int i=0; count<heapItem.size(); ++i)
{
for(int j=0; j<pow(i,2) && count<heapItem.size(); ++j)
{
std::cout << heapItem[count++]->b << " ";
}
std::cout << std::endl;
}
//make_heap, push_heap, pop_heap maintain min heap structure
return 0;
}