任何人都可以解释为什么不为std :: list实现operator []?我搜索了一下但没有找到答案。实施起来不是太难,或者我错过了什么?
答案 0 :(得分:69)
通过索引检索元素是链表的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序列都应该在分摊的常量时间(23.1.1 [lib.sequence.reqmts] / 12)中完成,这对vector
和{deque
来说是可行的。 {1}},但不是list
。
对于您实际需要此类事物的情况,您可以使用std::advance
算法:
int iter = xs.begin();
std::advance(iter, i);
int x = *iter;
答案 1 :(得分:3)
这对于实施者来说并不太难,但在运行时会太难,因为在大多数情况下性能会很糟糕。强制用户浏览每个链接会使其显示的内容比'myList [102452]'更明显。
答案 2 :(得分:1)
我想我在另一篇SO Extending std::list
中找到了答案“你的运营商[]是O(N)时间” - 这个 正是为什么它不包括在内 标准的std :: list&lt;&gt;。 - 迈克尔 伯尔12月14日17:29
不过,这是唯一的原因吗?
编辑:似乎人们提到它更多是关于性能的一致性问题,然后是严格的性能。
答案 3 :(得分:0)
实际上,由于两个原因,绝对没有理由不在(int)中提供operator []或至少方法: