私は、std::list<>
では、リスト自体のためにswap
関数がアンカーノードを交換することによって行われると仮定しています。ノードは、前のノードにアクセスし、前のノードの次のポインタを他のリストのアンカーを指すように容易に更新することができる。しかし、これはstd::forward_list
で行うことはできません(まあ、それはちょうど非常に高価です)。C++でのstd :: forward_list swap()の実装
私の前提が正しい場合、swap()
は効率的にstd::forward_list
に実装されていますか?そして、私たちがそれに就いている間に、はiterator
のためにどのように実装されていますかstd::forward_list
?
私は 'std :: list'が内部的に循環リストになっていて、' std :: forward_list'でも同じことを仮定していました。私はそれが完全に実装に依存していると推測しています。 – Samaursa
それらが循環リンクリストであっても、ノード自体のポインタを更新する必要はありません。リスト全体がスワップされているため、ノードリンクのいずれも変更されません。すべての変更は 'std :: list'からノードまでのポインタです。 – bames53
@ bames53:循環リストの場合、各ノードは次のノードまたはリストの末尾を指しています。そして、リストの末尾が先頭を指していて、先頭の要素を指しています。次に、テールポインタをスワップする方法は、テールを指すノードを調整する必要があり、リスト全体をトラバースしない限り、テールポインタに到達できないためです。または、テールポインタは、最後のノードだけでなく、ヘッドを指すオブジェクトですか? – Samaursa