(これは私が別のスレッドで与えた回答です。本質的に、単一の を使用するかなり素朴な実装でさえvector
、「一定の非償却 push_{front,back}」の要件に準拠していると主張しています。驚くかもしれません。 、これは不可能だと思いますが、驚くべき方法でコンテキストを定義する標準の他の関連する引用を見つけました. ご容赦ください; この回答で間違いを犯した場合、どのことを特定するのが非常に役立つでしょう.私は正しく、どこで私の論理が壊れているかを言いました. )
この回答では、適切な実装を特定しようとしているのではなく、C++ 標準の複雑さの要件を解釈するのを手助けしようとしているだけです。N3242から引用しています。これは、 Wikipediaによると、自由に入手できる最新の C++11 標準化ドキュメントです。(最終標準とは異なって編成されているように見えるので、正確なページ番号は引用しません。もちろん、これらの規則は最終標準で変更された可能性がありますが、私はそれが起こったとは思いません。)
を使用するdeque<T>
ことで、 を正しく実装できますvector<T*>
。すべての要素がヒープにコピーされ、ポインターがベクターに格納されます。(ベクトルについては後で詳しく説明します)。
なぜT*
代わりにT
?規格で要求されているため、
「両端キューのいずれかの端に挿入すると、両端キューへのすべての反復子が無効になりますが、両端キューの要素への参照の有効性には影響しません。」
(私の強調)。それT*
を満たすのに役立ちます。また、これを満たすのにも役立ちます。
「両端キューの先頭または末尾に単一の要素を挿入すると、常に ..... T のコンストラクターが 1 回呼び出されます。」
さて、(物議を醸す)ビットについて。vector
を格納するT*
ために を使用する理由 これにより、ランダム アクセスが可能になります。これは良いスタートです。vector の複雑さについてはしばらく忘れて、慎重に構築していきましょう。
標準は、「含まれるオブジェクトに対する操作の数」について述べています。正確に 1 つのオブジェクトが構築され、既存のオブジェクトが何らかの方法で読み取られたりスキャンされたりしないためdeque::push_front
、これは明らかに 1 です。この数 1 は明らかに定数であり、現在両端キューにあるオブジェクトの数とは無関係です。これにより、次のことが言えます。T
T
「私たちのdeque::push_front
では、含まれているオブジェクト (Ts) に対する操作の数は固定されており、すでに両端キューにあるオブジェクトの数とは無関係です。」
もちろん、 での操作の数はT*
それほど適切ではありません。がvector<T*>
大きくなりすぎると、再割り当てされ、多くT*
の がコピーされます。そうです、 での操作の数はT*
大きく異なりますが、 での操作の数はT
影響を受けません。
T
での操作のカウントと での操作のカウントのこの違いを気にするのはなぜT*
ですか? それは、標準に次のように記載されているためです。
この節のすべての複雑さの要件は、含まれるオブジェクトに対する操作の数に関してのみ述べられています。
の場合deque
、含まれるオブジェクトはT
ではなくです。T*
つまり、 をコピー (または再割り当て) する操作は無視できますT*
。
ベクターが両端キューでどのように動作するかについては、あまり説明していません。おそらく、これを循環バッファーとして解釈します (ベクターは常に最大値を使用しcapacity()
、ベクターがいっぱいになるとすべてをより大きなバッファーに再割り当てします。詳細は問題ではありません。
最後の数段落deque::push_front
で、deque 内のオブジェクトの数と、含まれているオブジェクトに対して push_front によって実行された操作の数との関係を分析しましたT
。そして、それらが互いに独立していることを発見しました。標準では、複雑さは操作に関するものであることが義務付けられているため、T
これには一定の複雑さがあると言えます。
はい、Operations-On-T*-Complexityは ( により) 償却されますが、 Operations-On-T-Complexityvector
のみに関心があり、これは一定です (非償却)。
vector::push_back または vector::push_front の複雑さは、この実装では関係ありません。これらの考慮事項は操作に関係するT*
ため、無関係です。標準が「従来の」複雑さの理論的概念に言及していた場合、「含まれるオブジェクトに対する操作の数」に明示的に制限されていなかったでしょう。私はその文を過度に解釈していますか?