0

ベクトル内の特定のオブジェクト(要素)についてaArray、最小のソート済みヒープを作成したいと思います。

  1. 他の関数ののメンバーを変更し、メンバーaArray関数を呼び出しHeapて最小ヒープを更新したい。これは、構造体に定数ベクトルを渡す必要があることを意味しHeapますが、これがエラーでいっぱいになっていることに多くの問題があります。定数オブジェクトをHeapコンストラクターに渡す適切な方法は何ですか?

  2. また、関数を呼び出すときにpopHeap、ヒープ内のルートへのポインターのみを削除したいのですが、ベクトル内のオブジェクトaArrayも削除されます。どうすればこれを修正できますか?

    #include <vector>
    #include <iostream>
    
    struct A
    {
        A(int av, int bv):a(av),b(bv){}
        int a, b;
    };
    
    struct Heap
    {
       Heap() : ptr(new std::vector<A>()) {}
    
       Heap(std::vector<A> *p) : ptr(p) {}
    
       void makeHeap()
       { // some code here }
    
       void popHeap()
       {
           ptr->erase(ptr.begin()+heapLoc[0]);  //DELETES aArray member! I only want to delete the pointer, not the object. 
           //some code here   
       }
    
       std::vector<A> *ptr;
       std::vector<int> heapLoc;
    };
    
    
    int main()
    {
         A a0(2,5), a1(4,2), a2(8,4), a3(0,3);  
         std::vector<A> aArray;  
         aArray.push_back(a0);  aArray.push_back(a1);  aArray.push_back(a2);   aArray.push_back(a3);
    
         for(int i=0; i<aArray.size(); ++i)
         {
            std::cout << "aArray[i].a = " << aArray[i].a << " "
                      << "aArray[i].b = " << aArray[i].b <<  "\n";
         } //All 4 objects outputted
    
         Heap h(&aArray);
         h.makeHeap();
    
         h.popHeap();
    
         for(int i=0; i<aArray.size(); ++i)
         {
            std::cout << "aArray[i].a = " << aArray[i].a << " "
                      << "aArray[i].b = " << aArray[i].b <<  "\n";
         } //Only 3 objects outputted. One gets deletated. 
    }
    
4

1 に答える 1

1

渡されたベクトル全体をコンストラクターにコピーします(ポインターだけを持たないでください)。(ソートされた要素のように)特定の構造を持つ必要があるものの内部構造を変更できるようにすることは、悪い考えです。これは次のように簡単に行うことができます。

class Heap
{
   ...
   Heap(std::vector<A> &input): vect(input) { };
   std::vector<A> vect;
}

上記を機能させるには、コピーコンストラクターを使用するか=、Aの演算子をオーバーライドする必要がありますが、両方を実行しても問題はありません。のように:

class A
{
   ...
   A(const A &o): a(o.a), b(o.b) {}; // Copy constructor
   void operator=(const A &o): a(o.a), b(o.b) {}; // = operator
}

両方のコードを追加すると、ヒープのコンストラクターでベクター内のすべての要素がコピーされます。ポインタは、明示的にディープコピーしない限り、常に浅くコピーされるため、これには機能しません。これは、もう少し手間がかかります。

これに代わる方法は、常に空のヒープから開始し、addメソッドを持つことです(まだポインターを使用していません)。

要素をコピーしたくない場合は、constキーワードを使用できます。を使用const Aしたコードのあらゆる場所で使用されているようにA

注1-makeHeapメソッドを削除し、コンストラクターでその作業を行うことをお勧めします。

注2-私はclass上記を使用しましたが、ではありませんstructstructC ++では使用せず、class代わりに使用してください。structもっとCです。

于 2012-12-04T15:53:17.493 に答える