web-dev-qa-db-ja.com

std :: dequeのソートはどのように実装されていますか?

これまでのところ、_std::deque_が内部でどのように実装されているかを学び、データが実際に格納されているnバイト配列へのポインタの配列のようなものであることを発見しました。だから今、私は両端キューに関連するいくつかの質問があります。

その構造についての私の現在の知識を説明する写真:enter image description here

質問は次のとおりです。

  1. _Push_front_操作が実行されていて、データブロック0に空き領域がない場合、新しいデータブロックがヒープに割り当てられ、この新しく割り当てられたメモリへのポインタが通常の配列のように「マップ」配列に挿入されます- --O(number_of_blocks)時間で、そうですか?

  2. この獣を分類する方法は?すべてのデータを配列にコピーし、並べ替えてから元に戻すことで、これ以上のことは想像できません。しかし、このアプローチにはO(n)補助メモリが必要です...しかし!_std::sort_は_std::vector_と_std::deque_の両方をソートするための同様のインターフェースを提供します。実装されているさまざまなデータ構造のアルゴリズム?テンプレートの特殊化を使用していますか?その場合、_std::list_を_std::sort_を使用して並べ替えることができないのはなぜですか?または、_std::sort_はの内部構造を気にしませんこのコンテナは、_std::vector_と_std::deque_の両方で類似している(_operator[]_、size()など)反復子とメソッドを使用しますか?このアイデアは合理的であり、 「なぜ_std::sort_ソート_std::list_ができないのですか?」に対する答えが明らかになります。

  3. データブロックのサイズはどのように選択されていますか? "実装に依存します"と言いますが、さまざまな実装とソリューションの背後にある動機について詳しく教えてください。

ここで説明が必要です。ありがとう。

14
vortexxx192

あなたの最初の質問に答えるために、はい、それはほとんどそれがどのように機能するかです。このアプローチは、マルチレベルの階層構造に拡張できることに注意してください。しかし、実際の実装は通常、写真に示されているとおり、2レベルの構造に固執します。

2番目の質問ですが、std::sortについて取り上げている場合、std::sortは、実際のコンテナの仕組みに関する知識がなくても機能します。ランダムアクセスイテレータの範囲で動作する場合。 std::dequeのイテレータはランダムアクセスイテレータであるため、std::sortstd::dequeに適用できます。そして実際には、そのようなデータ構造の要素へのランダムアクセスはかなり効率的であると主張することができます。ベクトルでのランダムアクセスほど効率的ではありませんが、std::sortのコンテキストで意味をなすのはかなり効率的です。

std::sortのイテレータはランダムアクセスイテレータではないため、std::liststd::listと一緒に使用することはできません。必要に応じて、std::list用のランダムアクセスイテレータの独自の些細な(遅い)バージョンを実装できます。このようなイテレータの範囲にstd::sortを適用して、std::liststd::sortでソートすることができます。しかし、明らかな理由で、それは法外に非効率的です。

std::dequeの場合、ランダムアクセスイテレータは十分に効率的です。

私は3番目の質問に答える準備ができていません。実際、これらのサイズが一連の実験に基づいて経験的に選択されていることを知っても驚くことではありません。そしてもちろん、「1つのサイズですべてに対応する」ソリューションはおそらくありません。

14
AnT