誰かがなぜ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. はなぜエラー「演算子^」
- 4. なぜstd :: ofstreamに演算子bool()を使用できないのですか
- 5. C/C++に|| =演算子がないのはなぜですか?
- 6. なぜRubyに!==演算子がないのですか?
- 7. Python - なぜ+ =演算子が動作しないのですか
- 8. 派生クラスで基本クラス演算子=(代入演算子)を使用しないのはなぜですか?
- 9. リストイテレータで+ =演算子を使用できないのはなぜですか?
- 10. なぜ*演算子をオーバーロードできないのですか?
- 11. XOR演算子とstd :: ostream演算子
- 12. なぜテンプレート演算子のオーバーロードが機能しないのですか?
- 13. unique_ptr演算子 - > const-overloadedではないのはなぜですか?
- 14. `std :: initializer_list`が添字演算子を提供しないのはなぜですか?
- 15. SAS:マクロ内のIN演算子がデフォルトでないのはなぜですか?
- 16. なぜJavascript演算子 "&&"が変なのですか?
- 17. std :: listのオーバーロードされたブラケット演算子
- 18. なぜ `<< std :: endl`が呼び出したい演算子を呼び出さないのですか?
- 19. "+ +"演算子の意味(++ではない)
- 20. structの&演算子がデジタルアドレスを返さないのはなぜですか?
- 21. SceneKitに演算子のオーバーロードがないのはなぜですか?
- 22. スプレッド演算子がノードv7.0.0で動作しないのはなぜですか?
- 23. JavaScriptでNOT演算子(!)が動作しないのはなぜですか?
- 24. <<演算子をオーバーロードしてstd :: listを出力する
- 25. なぜRustの演算子は出力変数型ですか?
- 26. std :: iteratorの演算子
- 27. なぜtypeofはプロパティではなく演算子ですか?
- 28. キャスト演算子がプライベートベースに使用されないのはなぜですか?
- 29. なぜ演算子||ここでは働いていないのですか?
- 30. OCamlではなぜリストコンストラクタは::演算子ではない
基本的に、それは人々が間違いを犯さないように防ぐことですか? –
あなたが守ることができない約束をしないでください。 STLでは、演算子[]は任意の要素への効率的なアクセスを約束します。 – jalf
そしてC++の標準参照のためにPavelに感謝します! –