これまでのところ、_std::deque
_が内部でどのように実装されているかを学び、データが実際に格納されているnバイト配列へのポインタの配列のようなものであることを発見しました。だから今、私は両端キューに関連するいくつかの質問があります。
その構造についての私の現在の知識を説明する写真:
質問は次のとおりです。
_Push_front
_操作が実行されていて、データブロック0に空き領域がない場合、新しいデータブロックがヒープに割り当てられ、この新しく割り当てられたメモリへのポインタが通常の配列のように「マップ」配列に挿入されます- --O(number_of_blocks)時間で、そうですか?
この獣を分類する方法は?すべてのデータを配列にコピーし、並べ替えてから元に戻すことで、これ以上のことは想像できません。しかし、このアプローチにはO(n)補助メモリが必要です...しかし!_std::sort
_は_std::vector
_と_std::deque
_の両方をソートするための同様のインターフェースを提供します。実装されているさまざまなデータ構造のアルゴリズム?テンプレートの特殊化を使用していますか?その場合、_std::list
_を_std::sort
_を使用して並べ替えることができないのはなぜですか?または、_std::sort
_はの内部構造を気にしませんこのコンテナは、_std::vector
_と_std::deque
_の両方で類似している(_operator[]
_、size()
など)反復子とメソッドを使用しますか?このアイデアは合理的であり、 「なぜ_std::sort
_ソート_std::list
_ができないのですか?」に対する答えが明らかになります。
データブロックのサイズはどのように選択されていますか? "実装に依存します"と言いますが、さまざまな実装とソリューションの背後にある動機について詳しく教えてください。
ここで説明が必要です。ありがとう。
あなたの最初の質問に答えるために、はい、それはほとんどそれがどのように機能するかです。このアプローチは、マルチレベルの階層構造に拡張できることに注意してください。しかし、実際の実装は通常、写真に示されているとおり、2レベルの構造に固執します。
2番目の質問ですが、std::sort
について取り上げている場合、std::sort
は、実際のコンテナの仕組みに関する知識がなくても機能します。ランダムアクセスイテレータの範囲で動作する場合。 std::deque
のイテレータはランダムアクセスイテレータであるため、std::sort
をstd::deque
に適用できます。そして実際には、そのようなデータ構造の要素へのランダムアクセスはかなり効率的であると主張することができます。ベクトルでのランダムアクセスほど効率的ではありませんが、std::sort
のコンテキストで意味をなすのはかなり効率的です。
std::sort
のイテレータはランダムアクセスイテレータではないため、std::list
をstd::list
と一緒に使用することはできません。必要に応じて、std::list
用のランダムアクセスイテレータの独自の些細な(遅い)バージョンを実装できます。このようなイテレータの範囲にstd::sort
を適用して、std::list
をstd::sort
でソートすることができます。しかし、明らかな理由で、それは法外に非効率的です。
std::deque
の場合、ランダムアクセスイテレータは十分に効率的です。
私は3番目の質問に答える準備ができていません。実際、これらのサイズが一連の実験に基づいて経験的に選択されていることを知っても驚くことではありません。そしてもちろん、「1つのサイズですべてに対応する」ソリューションはおそらくありません。