对于 vector aArray
中的某些对象(元素),我想创建一个最小排序堆。
我想在其他函数中修改
aArray
的成员,调用Heap
成员函数更新最小堆。这意味着我应该将一个常量 vector 传递给Heap
结构,但是我遇到了很多麻烦,因为它被错误淹没了。将常量对象传递给Heap
构造函数的正确方法是什么?此外,当我调用函数
popHeap
时,我只想删除指向堆中根的指针,但它会删除 vectoraArray
中的对象> 还有。我该如何解决这个问题?#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. }
最佳答案
在构造函数中复制整个传递的 vector (不要只有指向它的指针)。允许任何东西修改需要具有特定结构(如排序元素)才能工作的东西的内部结构是一个坏主意。您可以按如下方式简单地执行此操作:
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
}
添加这两段代码将在堆的构造函数中复制 vector 中的所有元素。指针对此不起作用,因为它们始终是浅复制的,除非您明确地深复制它们,这需要更多的努力。
替代方法是始终从一个空堆开始并使用一个add
方法(仍然不使用指针)。
如果不想复制元素,可以使用const
关键字。在你使用 A
的代码中的任何地方都使用 const A
。
注 1 - 我建议摆脱 makeHeap 方法,只在构造函数中完成这项工作。
注意 2 - 我在上面使用了 class
,而不是 struct
。不要在 C++ 中使用 struct
,而是使用 class
。 struct
更像 C。
关于c++ - 1. 将常量对象传递给结构 & 2. 删除 vector 中的指针元素,但不删除其指向的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546201/