정상적으로 작동하는 빨간색 검은 색 트리 알고리즘이 있습니다. 노드가 트리에 삽입되면 insert() 메서드는 호출자에게 삽입 된 노드에 대한 포인터를 반환합니다. 모든 포인터를 STL 벡터에 저장합니다.포인터 변경 추적
문제는 RB 트리가 작동하는 동안 때때로 이러한 포인터가 무효화된다는 것입니다. 예를 들어 노드 A의 값을 현재 노드에 복사 한 다음 노드 A를 삭제하는 rotateleft/right 중에 호출되는 메서드가 있습니다. 이제 노드 A에 대한 포인터가 해당 벡터에서 유효하지 않습니다.
나는1) 그 포인터를 보유하고있는 벡터 인덱스에 노드 포인터를 매핑 multimap은 유지, 다음과 같이 벡터의 포인터를 업데이트 할 수있는 방법을 생각.
2) 노드를 삭제하기 전에)
3
을 영향을받는 벡터의 모든 지점을 찾을 벡터를 반복하고 새로운 포인터4 이전 포인터를 변경하려면이과 multimap을 확인) 새로운 포인터를 반영하기 위해 멀티 맵의 키 값을 업데이트하십시오.
문제는 명백한 이유로지도 컬렉션의 키 값을 업데이트 할 수 없다는 것입니다. 또한 이것은 복잡성과 구현상의 이유로 끔찍한 해결책처럼 보입니다. 포인터의 동적 업데이트를 어떻게 수행 할 수 있는지에 대한 아이디어가 있습니까?
다음 노드와 이전 노드 모두에 포인터를 사용할 수 있습니까? 이렇게하면 포인터를 변경하면 "이전"포인터를 따라 포인터를 수정할 수 있습니다. – schnaader
시나리오가 불필요하게 복잡해 보입니다. 노드에 대한 포인터 벡터가 필요한 이유는 무엇입니까? 모든 노드 집합이 필요하면 트리를 탐색 할 수 있습니다. – Alan
Alan과 동의하십시오.왜 포인터를 벡터 안에 두어야합니까? 일반적으로 다른 위치에 원시 포인터를 유지하는 것은 큰 문제입니다. –