연결된 목록에서 노드를 제거한 후 꼬리 원시 포인터를 새 꼬리로 업데이트하는 방법을 알아 내려고하고 있습니다. 내가C++ - 연결된 목록의 unique_ptr 노드에 원시 포인터 할당
std::unique_ptr<Node> head ;
Node* tail ;
으로 나는 다음과 같은 구현을 뒤쪽에서 노드를 제거하는 내 함수에서 머리와 꼬리를 정의한
(숙제).
int Deque::remove_back(){
if (empty()) {throw std::runtime_error(std::string("Empty"));};
std::unique_ptr<Node> old;
Node* p = head.get();
int return_value = tail->val;
while (p->next != tail)
{p = p->next)}
old = move(tail);
tail = p;
return return_value;
}
그래서 꼬리는 유형 노드의 원시 포인터입니다. P는 Node 유형의 원시 포인터입니다.
Head는 Node 유형의 고유 한 포인터입니다.
나는 머리
P = P-> 다음에 P = head.get()
이제 P 점을 설정하고있어 내 노드를 반복해야합니다.
문제는 p->next != tail
P-> 다음은 어떤 페이지 다음 다음 노드에 대한 포인터는 것입니다.
node (tail) 유형의 원시 포인터와 같도록 노드에 대한 포인터를 설정하려고합니다.
나는 이것을 할 수 없다는 것을 알려줍니다.
나는 그것을 선언 한 관찰 대신에 소유 포인터로 바꾸지 않고 p-> 때문에 다음과 같이 생각합니다.
오류 :
Deque.cpp|68|error: no match for 'operator!=' (operand types are 'std::unique_ptr<Node>' and 'Node*')|
Deque.cpp|69|error: cannot convert 'std::unique_ptr<Node>' to 'Node*' in assignment|
Deque.cpp|71|error: no match for 'operator=' (operand types are 'std::unique_ptr<Node>' and 'std::remove_reference<Node*&>::type {aka Node*}')|
'꼬리 '를 사용 하시겠습니까? 그것은 전혀 도움이되지 않습니다. – Slava
그래, 불행히도. : – TigerCode
단일 링크 된 목록의'tail'은 목록 끝에있는 빠른 삽입에만 유용하지만 목록 끝에있는 빠른 제거에는 사용할 수 없기 때문에 쓸모 없습니다. –