誰かがなぜoperator []がstd :: listに実装されていないのか説明できますか?少し調べてみましたが、答えが見つかりません。実装するのはそれほど難しいことではないでしょうか、それとも何かが足りないのでしょうか?
インデックスによる要素の取得は、リンクリストのO(n)操作であり、これはstd::list
です。したがって、operator[]
を提供することは欺瞞的であると判断されました。人々はそれを積極的に使用したくなるので、次のようなコードが表示されます。
std::list<int> xs;
for (int i = 0; i < xs.size(); ++i) {
int x = xs[i];
...
}
これはO(n ^ 2)です-非常に厄介です。したがって、ISO C++標準では、operator[]
をサポートするすべてのSTLシーケンスは、vector
で達成可能な償却一定時間(23.1.1 [lib.sequence.reqmts]/12)で実行する必要があると具体的に述べています。 deque
ですが、list
ではありません。
実際にそのようなものが必要な場合は、std::advance
アルゴリズムを使用できます。
int iter = xs.begin();
std::advance(iter, i);
int x = *iter;
(実装者にとって)それほど難しいことではありませんが、ほとんどの場合、パフォーマンスがひどいため、実行時にはそれほど難しくありません。ユーザーに各リンクを通過させると、「myList [102452]」よりもそこで何が起こっているのかが明確になります。
私は別のSO post Extending std :: list で答えを見つけたと思います
"your operator [] is O(N) time"-これが、標準のstd :: list <>に含まれていない理由です。– Michael Burr 12月14日17:29
それでも、それが唯一の理由ですか?
編集:人々が言及したように、それは厳密にパフォーマンスよりもパフォーマンスに関する一貫性の問題であるように思われます。
実際には、次の2つの理由から、operator []または少なくともメソッドat(int)を提供しない理由はまったくありません。