2012-12-04 1 views
5

제가 이해 하듯이 unique_ptr은 독점권을 나타냅니다. 단일 연결리스트 (pseduocode 경고)unique_ptr <>을 사용하여 목록을 구현하고 있습니까?

class node{ 
public: 
     unique_ptr<node> next; 
     int value; 
}; 

같은, 다음을 소유하는 각 노드와이 맞는 것 같다하지만 난이 일을 사용 해요 목록을 통과하는 등의 작업을 수행하는 방법을 이해하지 않습니다

here=here->next; 

unique_ptr을 사용하여 데이터 구조를 구현하는 방법은 무엇입니까? 그들은 직업에 적합한 도구입니까?

답변

6

당신이 노드를 통해 갈 때, 당신은 의미 노드 포인터를 소유하지 않아도

여기에 = 여기 -> 다음;

여기에 unique_ptr이 있으면 올바르지 않습니다. 개체를 소유한다는 것은 "생명과 죽음에 대한 책임"을 의미합니다. 즉 소유자가 개체를 파괴 할 코드를 가진 사람임을 의미합니다. 다른 소유권 정의를 사용하면 unique_ptr의 의미가 아닙니다.

목록 노드 코드에서는 각 노드가 다음 노드를 담당한다고 가정합니다 (노드를 파괴하면 다음 노드도 모두 파괴됩니다). 그것은 올바른 행동 일 수 있습니다. 그것은 당신의 필요에 달려 있으며, 당신이 정말로 원하는 것이 확실합니다.

원하는 것은 소유하지 않고 포인터를 읽는 것입니다. 이를 수행하는 현재 좋은 방법은이 코드를보고있는 다른 개발자에게 "사용하지만 소유하지 않음"을 나타내는 원시 포인터를 사용하는 것입니다 (unique_ptr은 "내가 죽으면 뾰족한 물건도 죽습니다").

node* here = nullptr; // it will not own the pointed nodes (don't call delete with this pointer) 
here = &first_node(); // assuming first_node() returns a reference to the first node 
here = here->next.get(); // to get the next node without owning it: use get() - true in all smart pointers interface 
+0

다음 노드에 대한 책임을 노드에 맡기지 않고 원시 포인터와 스마트 포인터간에 변환하는 방법을 알아 내려고 노력 중이며 가장 직접적인 것으로 보입니다. 대안에 대한 제안? –

+1

글쎄, shared_ptr을 사용하면 더 비싸지 만 다루기가 더 쉽다. 노드를 분리하는 것은 매우 쉬울 것입니다. 즉, 최적화 된 목록 구현은 원시 포인터 및 사용자 지정 노드 할당을 통해 수행됩니다. – Klaim

+0

'std :: swap'을 잊지 마라. –

관련 문제