对于向量aArray
中的某些对象(元素),我想创建一个mininum排序堆。
我想在其他函数中修改aArray
的成员,并调用Heap
成员函数来更新最小堆。这意味着我应该将一个常量向量传递给Heap
结构,但是我遇到了很多麻烦,因为它被错误地淹没了。将常量对象传递给Heap
构造函数的正确方法是什么?
此外,当我调用函数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.
}
答案 0 :(得分: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
。不要在C ++中使用struct
,而是使用class
。 struct
更多是C。