2017-12-18 10 views
0

내가 노드 클래스는 부모를 왼쪽과 오른쪽 아이 노드 * 포인터에 unique_ptr 가지고있는 트리를 짓고 있어요. 노드를 삭제할 때 노드를 가져 와서 삭제중인 노드가 왼쪽 자식의 오른쪽인지 확인한 다음 부모의 unique_ptr을 다시 설정해야합니다. 포인터를 가져 와서 주위에 unique_ptr 래퍼가 있는지 물어볼 수있는 방법이 있습니까?포인터가 속한 unique_ptr (있는 경우)을 얻을 수 있습니까?

+0

[std ::/enable_shared_from_this'] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this)를 사용하여 일부 std :: shared_ptr에 대해 수행 할 수 있습니다. –

+2

당신이 무엇을 요구하는지는 분명하지 않습니다. 트리에서 노드를 삭제하면 부모 포인터를 조정할 수 있도록 부모 포인터/참조를 가져와야합니다. 이것은 고유 vs 원시 vs 공유 포인터와 아무 관련이 없습니다. 일반적으로 예 : RB의 나무, 각 노드와 부모 포인터 (https://stackoverflow.com/questions/46119328/c-running-time-of-next-and-prev-in-a-multiset-iterator/46119946#을 포함 할 것 46119946). 그래서 당신이 뭔가를 할 수 있습니다 :'경우 (this-> 학부모> left.get() ==이) {// 현재 노드가 남아있는 아이} 다른 {//입니다 못했습니다}'. 내가 노드에 다시 전화를해야 단지 것 unique_ptr 참조로 노드와 조작했지만, 지금은 한 단계 위로 이동하고 왼쪽 또는 오른쪽으로 자녀의 경우 이미 내가 원하는 포인터를해도 확인해야하는 경우 –

+0

@NirFriedman 지우다. 부모 포인터를 조정해야한다는 것을 이해하지만 unique_ptr 참조를 재설정해도 문제가 해결되지 않을까요? – Davar

답변

5

포인터를 가져 와서 주위에 unique_ptr 래퍼가 있는지 묻는 방법이 있습니까?

unique_ptr을 찾을 할 일반적인 방법은 없습니다,하지만 당신은 예를 들어, 참조를 저장할 수 있습니다.

당신의 나무가 이진 가정하면,이 같은 부모의 unique_ptr을 찾을 수 있습니다 나무가 바이너리하지

(parent->left == this ? parent->left : parent->right).release(); 

경우, 모든 아이들을 반복 할 수 있습니다.

C++에서
0

포인터는 단방향이고; 그리고 unique_ptr은 단순히 포인터 주위의 래퍼 클래스이므로 변경되지 않습니다. 포인터가 가리키는 원시 포인터에서 unique_ptr을 가져올 방법이 없습니다. 특정 문제에

몇 가지 다른 솔루션이 가능합니다 :

  1. 는 자식 객체에 부모 포인터를 추가 당신은 거기에서 아이를 삭제하는 부모를 탐색 할 수 있습니다. 노드가 많은 경우 비효율적 일 수 있습니다. (예를 들어, 노드를 삭제) 트리를 수정할 수있는 충분한 정보를 전달 컨텍스트의 추상화 -
  2. 반복자의 개념을 구현합니다. 예를 들어, 트리 이터레이터는 현재 노드에 대한 포인터, 부모에 대한 포인터 및 왼쪽 자식 또는 오른쪽 자식인지를 나타내는 플래그를 포함 할 수 있습니다. 단점은 노드에 대한 포인터를 가짐으로써 트리를 수정할 수 없다는 것입니다. 반복자의 인스턴스가 있어야합니다.
관련 문제