2014-09-06 2 views
0

오브젝트를 하나의 C++ std::map에서 참조하여 다른 오브젝트에 넣으려는 경우 - 예를 들어 오브젝트를 낮은 우선 순위 트리에서 높은 우선 순위 트리로 이동하려는 경우.C++ map :: 지우기 동작

내가개체를 하나의 트리에서 가져온 경우 완전히 무효화합니까? 한 번에 두 나무에 모두 넣은 다음 erase (즉, 개체가 두 번 참조됩니다).

설명서에 따르면 개체는 어느 경우에도 무효화되지만 IMHO는 100 % 명확하지 않습니다.

갱신 여기는 예 -하지만이 그냥 작동하지 않을 것을 나에게 보인다 - 적어도 참조를 사용 - ... 내가 포인터의 일부 양식을 사용해야합니다

PartialPage oldPage = hTree->oldestPage(); 
lTree->insertOldPage(oldPage); 
hTree->erase(oldPage); 

NB oldestPage()PartialPage

+1

엘리먼트가 2 개의 맵에 동시에있을 수 있다면'std :: shared_ptr'을 사용할 수 있습니다. 만약 std :: unique_ptr을 사용하지 않는다면 다른 맵으로 이동할 수 있습니다. 절차는'elem' 예를 들어 :'find' 함수로 다른지도로 이동합니다 (이 시점에서 ptr은 비어있을 것입니다),'elem'을 지 웁니다. – NetVipeC

+2

지도에 실제로 무엇을 저장하고 있습니까? 객체 또는 포인터입니까? –

+0

개체 - 내가 아무 것도 숨기고있는 것처럼 보입니다. ( – adrianmcmenamin

답변

1

에 대한 참조를 반환합니다. 컨테이너는 자체 사본을 저장함으로써 요소를 소유합니다. 귀하의 개체는 언제든지 "양쪽 용기"에 이 아니며이 아닙니다.

공유 리소스 의미론을 도입하려면지도에 std::shared_ptr<PartialPage> 초를 저장해야합니다.