Может ли кто-нибудь объяснить, почему оператор [] не реализован для std:: list? Я немного искал, но не нашел ответа. Это было бы не слишком сложно реализовать, или я что-то пропустил?
Почему нет оператора [] для std:: list?
Ответ 1
Получение элемента по индексу - это операция 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 С++ специально упоминает, что все 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;
Ответ 2
Это было бы не слишком сложно (для исполнителя), но это было бы слишком сложно во время исполнения, так как производительность в большинстве случаев будет ужасной. Принуждение пользователя к просмотру каждой ссылки сделает более очевидным то, что происходит там, чем "myList [102452]".
Ответ 3
Я думаю, что нашел ответ в другом сообщении SOA Расширение std:: list
"ваш оператор [] - это время O (N)" - это именно поэтому он не включен в стандартный std:: list < > . - Майкл Burr Dec 14 at 17:29
Тем не менее, это единственная причина?
EDIT: Кажется, что, как говорили люди, это скорее согласованность в отношении производительности, а затем строгое выполнение.
Ответ 4
Собственно, нет абсолютно никаких причин не предоставлять оператор [] или, по крайней мере, метод в (int), из-за двух причин:
- Это список с двойной связью, поэтому вам нужно переместить максимум()/2 места для вашего итератора, чтобы получить свой индекс, а затраты на внутреннее хранение нескольких фиксированных итераторов очень низки. И в конце, в библиотеке Qt есть оператор [] и at, и я не вижу стоимости его использования.
- заставить людей что-то не использовать - очень плохая привычка к программированию, потому что в списке будет много полезного контейнера, если у вас есть "произвольный доступ" возле связанного доступа, есть множество примеров, когда вам нужен как доступ, так и какая точка выполнения.