Получение элемента по индексу является операцией 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 ++ конкретно упоминается, что все последовательности STL, которые поддерживают operator[]
, должны делать это в амортизированном постоянном времени (23.1.1 [lib.sequence.reqmts] / 12), что достижимо для vector
и deque
, но не list
.
Для случаев, когда вам действительно нужны такие вещи, вы можете использовать std::advance
алгоритм:
int iter = xs.begin();
std::advance(iter, i);
int x = *iter;