为什么std :: list没有operator []?

时间:2009-07-11 01:56:57

标签: c++ list stl

任何人都可以解释为什么不为std :: list实现operator []?我搜索了一下但没有找到答案。实施起来不是太难,或者我错过了什么?

4 个答案:

答案 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 []或至少方法:

  • 它是双链表,所以你需要移动最多size()/ 2位你的迭代器来获取你的索引,并且内部保留一些固定迭代器的成本非常低。最后,Qt库提供了operator []和at,我没有看到使用它的性能成本。
  • 迫使人们不使用的东西是一个非常糟糕的编程习惯,因为列表将是非常有用的容器,如果你在链接访问附近有“随机访问”,当你需要两个访问时,有各种各样的例子,取决于哪个运行时点。