誰かがなぜstd :: listの演算子[]が実装されていないのか説明できますか?私はちょっと調べましたが、答えが見つかりませんでした。それは実装するのが難しくないでしょうか、何かが欠けていますか?std :: listの演算子[]がないのはなぜですか?
答えて
インデックスで要素を取得するのは、リンクリストのO(n)操作で、これはstd::list
です。だから、それが人々が積極的にそれを使用するように誘惑されるため、operator[]
を提供することは詐欺的であろうと決定し、その後、次のようなコードを参照してくださいね:O(N^2)である
std::list<int> xs;
for (int i = 0; i < xs.size(); ++i) {
int x = xs[i];
...
}
- 非常に厄介なの。したがって、ISO C++標準では、vector
とdeque
では達成可能な償却された一定時間(23.1.1 [lib.sequence.reqmts]/12)でをサポートするすべてのSTLシーケンスを実行する必要があると述べていますが、list
ではありません。
あなたが実際にそういったことを必要とする場合のために、あなたはstd::advance
アルゴリズムを使用することができます
int iter = xs.begin();
std::advance(iter, i);
int x = *iter;
実行者にとってはそれほど難しくありませんが、ほとんどの場合パフォーマンスがひどくなるため、実行時にはそれほど難しくありません。ユーザーに各リンクを強制的に渡すと、そこで起こっていることが「myList [102452]」より明らかになります。
ビット演算子[]は、他のすべての場所で一定の時間演算です。 O(n)操作に同じ名前を付けると、一貫性がなく混乱することになります。 – dmckee
地図ではO(log n)ですが、あなたの意見が分かります。 –
マップでは明らかにポジションインデックスではありません。マップキーが整数の場合を除いて、ただしキー参照によるポジションアクセスが混乱している場合は、既に大きな問題があります;) –
を私は他に答えを見つけたと思うSO] [Extending std::list
」あなたのオペレータを投稿O(N)time "である - は、 標準のstd :: list <>には含まれていません。 - マイケル Burr 12月14日17:29
それでも唯一の理由はありますか?
EDIT:それはパフォーマンスに関して厳密にはパフォーマンスの点で一貫性の問題ですが、
あなたはその理由が十分ではないという意味ですか? :-) –
です。他の場所を見ると、.NETの 'LinkedList'はほとんど同じ理由でインデクサーを提供しません。それはあまりにも欺瞞的です。伝統的に、何かに位置インデクサがあるとき、操作はO(1)であると仮定されます。 –
は実際に、オペレータ[]または(INT)で少なくとも方法を提供しないする理由は2つの理由で、絶対にありません:
- それは、二重リンクリストであるので、あなたはで移動する必要がありますほとんどのサイズ()/ 2はイテレータをインデックスに追加しますが、内部的には固定イテレータを保持するコストは非常に低くなります。そして最後に、Qtライブラリは演算子[]とatを提供していますが、それを使ったパフォーマンスのコストはわかりません。
- あなたがリンクされたアクセスの近くに "ランダムアクセス"を持っている場合は、リストが多くの使用可能なコンテナになるので、人に何かを使わないように強制するのは非常に悪いプログラミング習慣です。どのランタイムポイント。
これは純粋にあなたの意見に基づいているのでしょうか、あるいは、あなたは 'std :: list
- 1. std :: shared_ptrに[]演算子がないのはなぜですか?
- 2. []演算子はstd :: listですか?
- 3. C/C++に|| =演算子がないのはなぜですか?
- 4. 派生クラスで基本クラス演算子=(代入演算子)を使用しないのはなぜですか?
- 5. なぜテンプレート演算子のオーバーロードが機能しないのですか?
- 6. unique_ptr演算子 - > const-overloadedではないのはなぜですか?
- 7. なぜJavascript演算子 "&&"が変なのですか?
- 8. `std :: initializer_list`が添字演算子を提供しないのはなぜですか?
- 9. <<演算子をオーバーロードしてstd :: listを出力する
- 10. キャスト演算子がプライベートベースに使用されないのはなぜですか?
- 11. OCamlではなぜリストコンストラクタは::演算子ではない
- 12. Pythonの "&=" set演算子が "&="整数演算と異なる動作をするのはなぜですか?
- 13. なぜキャスト演算子を比較に使用できないのですか?
- 14. CUDA:なぜビット演算子が論理演算子より速いのですか?
- 15. なぜ加算演算は乗算演算より速いのですか?
- 16. C++に演算子の同義語が必要なのはなぜですか?
- 17. なぜstd :: stringを書き込んで、未知の演算子<<エラー?
- 18. なぜ私はブーストPythonベクトルインデックススイートで比較演算子が必要ですか?
- 19. なぜC++はユーザ定義演算子を許可しないのですか?
- 20. オーバーロード比較です演算子「無効な演算子は、<」
- 21. なぜLIKE演算子のESCAPE引数がありますか?
- 22. なぜ算術演算子とアクセス演算子を使用するときにアップキャストするのですか?
- 23. 演算子のあいまいなオーバーロード+
- 24. 代入演算子の呼び出しコンストラクタはなぜですか?
- 25. fstreamはなぜ演算子>>のistreamプロトタイプを利用していないのですか?
- 26. Java 7のダイヤモンド演算子:なぜ実装が難しいのですか?
- 27. bool = trueのときに補数演算子が機能しないのはなぜですか?
- 28. なぜビットワイズ&演算子は短絡していませんか?
- 29. static_castのような演算子の優先度はなぜですか?
- 30. 3値演算子の結果が右辺値ではない
基本的に、それは人々が間違いを犯さないように防ぐことですか? –
あなたが守ることができない約束をしないでください。 STLでは、演算子[]は任意の要素への効率的なアクセスを約束します。 – jalf
そしてC++の標準参照のためにPavelに感謝します! –