내가 노드 클래스는 부모를 왼쪽과 오른쪽 아이 노드 * 포인터에 unique_ptr 가지고있는 트리를 짓고 있어요. 노드를 삭제할 때 노드를 가져 와서 삭제중인 노드가 왼쪽 자식의 오른쪽인지 확인한 다음 부모의 unique_ptr을 다시 설정해야합니다. 포인터를 가져 와서 주위에 unique_ptr 래퍼가 있는지 물어볼 수있는 방법이 있습니까?포인터가 속한 unique_ptr (있는 경우)을 얻을 수 있습니까?
0
A
답변
5
포인터를 가져 와서 주위에 unique_ptr 래퍼가 있는지 묻는 방법이 있습니까?
는unique_ptr
을 찾을 할 일반적인 방법은 없습니다,하지만 당신은 예를 들어, 참조를 저장할 수 있습니다.
당신의 나무가 이진 가정하면,이 같은 부모의 unique_ptr
을 찾을 수 있습니다 나무가 바이너리하지
(parent->left == this ? parent->left : parent->right).release();
경우, 모든 아이들을 반복 할 수 있습니다.
C++에서
0
포인터는 단방향이고; 그리고 unique_ptr
은 단순히 포인터 주위의 래퍼 클래스이므로 변경되지 않습니다. 포인터가 가리키는 원시 포인터에서 unique_ptr
을 가져올 방법이 없습니다. 특정 문제에
몇 가지 다른 솔루션이 가능합니다 :
- 는 자식 객체에 부모 포인터를 추가 당신은 거기에서 아이를 삭제하는 부모를 탐색 할 수 있습니다. 노드가 많은 경우 비효율적 일 수 있습니다. (예를 들어, 노드를 삭제) 트리를 수정할 수있는 충분한 정보를 전달 컨텍스트의 추상화 -
- 는 반복자의 개념을 구현합니다. 예를 들어, 트리 이터레이터는 현재 노드에 대한 포인터, 부모에 대한 포인터 및 왼쪽 자식 또는 오른쪽 자식인지를 나타내는 플래그를 포함 할 수 있습니다. 단점은 노드에 대한 포인터를 가짐으로써 트리를 수정할 수 없다는 것입니다. 반복자의 인스턴스가 있어야합니다.
관련 문제
- 1. 포인터가 있다면, 그것이 속한 _HEAP_ENTRY를 어떻게 찾을 수 있습니까?
- 2. unique_ptr 및 일반 포인터가 일치하지 않습니다.
- 3. WPF에서, 어떻게 그것에 속한 UIElement에서 RowDefinition 개체를 얻을 수 있습니까?
- 4. 포인터가 Unity3D에있는 UI 요소를 어떻게 얻을 수 있습니까?
- 5. C에서 변수가 속한 유형을 찾을 수 있습니까?
- 6. unique_ptr 년대는
- 7. `unique_ptr` 할당을위한 간략한 표기법?
- 8. 내 프로그램에 매달려있는 포인터가 있습니까?
- 9. 개체가 속한 클래스를 어떻게 확인할 수 있습니까?
- 10. GridVIew에 속한 확인란을 어떻게 확인할 수 있습니까?
- 11. 메소드가 속한 인스턴스를 어떻게 찾을 수 있습니까?
- 12. IJavaElement가 속한 IClasspathEntry를 어떻게 알 수 있습니까?
- 13. 바이너리의 ifstream에서 unique_ptr 만들기
- 14. 방법 X, Y에 따라보기에서 개체를 얻을 수 (있는 touchesMoved)
- 15. C++ 포인터가 파괴되었는지 알 수 있습니까?
- 16. 클래스 내의 포인터가 이것을 가리킬 수 있습니까?
- 17. 포인터가 NSObject인지 어떻게 알 수 있습니까?
- 18. 포인터가 시작점에서 얼마나 멀리 가리킬 수 있습니까?
- 19. 무효 포인터가 안전하게 포인터를 가리킬 수 있습니까?
- 20. 포인터가 가리키는 항목의 크기를 가져올 수 있습니까?
- 21. 리퍼러를 얻을 수 있습니까?
- 22. CUDA 스마트 포인터가 있습니까?
- 23. unique_ptr 변환
- 24. 시간 지정 포인터가 있습니까?
- 25. unique_ptr : 거기
- 26. com.sun.jndi.ldap. * 패키지의 소스는 어디서 얻을 수 있습니까?
- 27. 목록에서 값의 포인터로 unique_ptr 제거
- 28. Regex.Split에서 여러 개의 공백을 얻을 수 있습니까?
- 29. 하스켈에 포인터가 있습니까?
- 30. 어떻게하면 이런 탭 레이아웃을 얻을 수 있습니까
[std ::/enable_shared_from_this'] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this)를 사용하여 일부 std :: shared_ptr에 대해 수행 할 수 있습니다. –
당신이 무엇을 요구하는지는 분명하지 않습니다. 트리에서 노드를 삭제하면 부모 포인터를 조정할 수 있도록 부모 포인터/참조를 가져와야합니다. 이것은 고유 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 참조로 노드와 조작했지만, 지금은 한 단계 위로 이동하고 왼쪽 또는 오른쪽으로 자녀의 경우 이미 내가 원하는 포인터를해도 확인해야하는 경우 –
@NirFriedman 지우다. 부모 포인터를 조정해야한다는 것을 이해하지만 unique_ptr 참조를 재설정해도 문제가 해결되지 않을까요? – Davar