Heap
데이터 유형을 구현하려고 시도했지만 벽에 부딪 혔습니다. 이전 답변의 많은 moar 코드를 요구하기 때문에벡터의 크기를 얻으려고 시도하면 segfault가 발생합니다.
는 여기있다 :
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
template <typename T> void display_array(vector<T> arr, bool endline = true)
{
cout << arr.size() << endl;
for (int i = 0; i < arr.size() - 1; i++) cout << arr[i] << ", ";
cout << arr[arr.size() - 1];
if(endline) cout << endl;
}
template <class T> class Heap
{
//typedef T Node;
// setw(...);
//private:
public:
vector<T>* elems;
Heap() : elems(nullptr)
{
this->elems = new vector<T>;
}
Heap(vector<T> e)
{
this->elems = new vector<T>(e);
}
Heap(vector<T>* e)
{
this->elems = e;
}
Heap(Heap<T>& h)
{
this->elems = new vector<T>(h.elems);
}
~Heap()
{
delete elems;
}
T elemAt (int index)
{
return (*(this->getElems())) [index];
}
vector<T>* getElems()
{
return this->elems;
}
int parent (int index)
{
return index/2;
}
long getSize()
{
return this->getElems()->size();
}
int left (int index)
{
return 2 * index;
}
T leftElem (int index)
{
return this->elems [2 * index];
}
int right (int index)
{
return 1 + 2 * index;
}
T rightElem (int index)
{
return this->elems [1 + 2 * index];
}
bool withinHeap (int index)
{
return index <= (this->getSize());
}
void maxHeapify(int index)
{
int largest = index;
int l = left(index);
int r = right(index);
if (withinHeap(l) && elemAt(l) > elemAt(index))
{
if (withinHeap(r) && elemAt(r) > elemAt(l))
{
largest = r;
}
largest = l;
}
if (largest != index)
{
int temp = elemAt(index);
elemAt(index) = elemAt(largest);
elemAt(largest) = temp;
delete temp;
}
/* or return withinHeap(l) && elemAt(l) > elemAt(index) ? withinHeap(r) && elemAt(r) > elemAt(l) ? r : l : index; :) */
}
void display(int current, int indent)
{
if(withinHeap(left(current))) display(left(current), indent + 4);
if (indent > 0) cout << setw(indent) << " ";
cout << elemAt(current) << endl;
if(withinHeap(right(current))) display(right(current), indent + 4);
}
};
int main()
{
vector<int> vec {2, 5, 4, 12, 3, 9};
Heap<int>* h = new Heap<int>(vec);
display_array(*h->getElems());
h->display(0, 0);
return 0;
}
이 마지막 문 (h->display(0,0)
)이 세그먼트 폴트가 발생합니다. 나는 getSize()
함수로 그것을 좁혔다. GDB에서
, print this.elems
및 print *this.elems
(그들은 객체 추적을 반환하거나라고하든) 괜찮아,하지만 난 입력 할 때 print *this.elems->size()
GDB는 정말이야
Cannot access memory at address 0xbf7fffef
로 응답 새로운 C++ 및 gdb 및 모든 것. 여기 뭐가 잘못 됐니?
FYI에서 'Heap' 클래스는 3 행의 main() 프로그램으로 깨질 수 있습니다. 사용자 정의 할당 연산자가 없기 때문에 모두. – PaulMcKenzie
'vector'에 대한 포인터가 정말로 필요하거나 원하지 않습니다. –
문제는 귀하의 알고리즘 내에있는 getSize() 함수와 관련이 없습니다. 나는 getSize() 내부에 cout 문을 넣었고 터미널은 스팸 메일을 받았습니다. 내 추측은 스택 오버플로가 귀하의 재귀 함수의 결함으로 인해지고있다. –