0

对于 vector 中的某些对象(元素)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上面使用过,而不是struct. 不要struct在 C++ 中使用,class而是使用。struct更多 C.

于 2012-12-04T15:53:17.493 回答