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

Gab*_*yer 32 c++ stl list

谁能解释为什么不为std :: list实现operator []?我搜索了一下但没有找到答案.实施起来不是太难,或者我错过了什么?

Pav*_*aev 72

通过索引检索元素是链表的O(n)操作,这是什么std::list.所以决定提供operator[]会有欺骗性,因为人们会想要积极地使用它,然后你会看到如下代码:

 std::list<int> xs;
 for (int i = 0; i < xs.size(); ++i) {
     int x = xs[i];
     ...
 }
Run Code Online (Sandbox Code Playgroud)

这是O(n ^ 2) - 非常讨厌.所以ISO C++标准特别提到,支持所有STL序列operator[]应该这样做在分期常量时间(23.1.1 [lib.sequence.reqmts]/12),这是可以实现的用于vectordeque,但不是list.

对于您实际需要此类事物的情况,您可以使用std::advance算法:

int iter = xs.begin();
std::advance(iter, i);
int x = *iter;
Run Code Online (Sandbox Code Playgroud)

  • 是的.或者不做出你无法保留的承诺.在STL中,operator []承诺*有效*访问任意元素. (17认同)
  • 注意,std :: list :: size()也可能是O(n)(参见http://stackoverflow.com/questions/228908/is-listsize-really-on/228914),因此第一个循环可能是O (n ^ 2)即使没有调用operator []. (9认同)