リンクリスト内のノードを削除した後、テールローポインタを新しいテールに更新する方法を解明しようとしています。私は、次の実装を持って戻ってからノードを除去するため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;
}
したがって、tailはNode型の生ポインタです。 PはNode型の生ポインタです。
HeadはNode型の一意のポインタです。
私は頭
P = P - >次へと、P = head.get()
ので、今のpポイントを設定していますが、私のノードを停止反復処理する必要があります。
問題がp->next != tail
P->次は何Pの次のノードへのポインタであることです。
ノードへのポインタを、ノード(テール)タイプの生ポインタと等しくなるように設定しようとしています。
私はこれを行うことはできません。
私はそれが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*}')|
あなたは 'tail'を使用する必要がありますか?それはまったく助けにならない。 – Slava
残念ながら、 : – TigerCode
シングルリンクリストの 'tail'は、リストの最後にあるファーストインサートにのみ有効ですが、リストの最後に速いリムーバブルに使うことはできないので、無駄です。 –