2016-03-31 6 views
3

次のような些細な疑問がありますが、これまでに質問されたことがありますが、検索で回答を見つけることができませんでした。std :: forward_listはマニュアルの再ポインティングをサポートしていますか?

私がしようとしているのは、C++の「Coding Interview」の演習のいくつかを実装するためにstd :: forward_listを使うことです。私の理解では、リンクリスト要素にはa)データと、b)次の要素へのポインタが含まれています。解決策のいくつかは、この(擬似コード)しかし

node1.next = node1.next.next.next; // Effectively deletes 2 elements 

のように、私はforward_list documentationでこれを行うにはどのような方法を見つけることができない、別の要素に「次」ポインタを再指し示す必要?私は何かを逃しているのですか、それとも不可能なのでしょうか?

誰かが正しい質問に感謝してくれればとってもうれしく思います!

答えて

3

std::forward_listに手を加えないでください。すべての仕組みが隠されています。これが作成された理由です!

代わりに、ビジネス操作を実行する必要があります。たとえば、リストから要素を削除するには、erase_after()に電話する必要があります.1ショットで2つの連続ノードを削除することもできます。

+6

をstd :: forward_list'? :P –

+2

@MateenUlhaq、私は人生の目的があると信じたいです:) – SergeyA

2

これはできません。

あなたが欠けているのは、標準のライブラリコンテナが実装されている方法の詳細が部分的に隠れているということです。内部の「次の」ポインタは、あなたには見えない実装の詳細です。 (これはstd::forward_listとはあまり関係ありませんが、これは単なるリンクリストですが、例えばstd::setと関連しています。内部の赤色/黒色の色フィールドにアクセスすることはできません。自己平衡化ツリーの種類)

次の2つの要素を削除する正しい方法は、単に公開API、std::forward_listを使用することです。

my_list.erase_after(iterator_to_node); 
my_list.erase_after(iterator_to_node); 
1

パブリックAPIを使用する必要があります。そうしないと、メモリがリークする恐れがあります。 forward_listはポインタへの直接アクセスを提供しませんが、erase_aftersplice_afterの間では、同等の効率で同じタスクを達成するためにforward_listの助けを得ることができます。

リストmylistにイテレータitを持っていた場合、あなたは2つの後続の要素削除するには、同じ論理2つの要素の削除を行うことができます:あなたは `で手動repointingをやってからOPを防ぐために作成された

mylist.erase_after(it, std::next(it, 3)); 
+1

リストイテレータのみがランダムアクセスイテレータであれば... – SergeyA

+1

@SergeyA少なくとも修正するのは簡単です: 'std :: next 、3) ' –

+0

@Revolver_Ocelot、私はこれをよく知っています。 – SergeyA

関連する問題