Подтвердить что ты не робот

Почему нет оператора [] для std:: list?

Может ли кто-нибудь объяснить, почему оператор [] не реализован для std:: list? Я немного искал, но не нашел ответа. Это было бы не слишком сложно реализовать, или я что-то пропустил?

4b9b3361

Ответ 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, и я не вижу стоимости его использования.
  • заставить людей что-то не использовать - очень плохая привычка к программированию, потому что в списке будет много полезного контейнера, если у вас есть "произвольный доступ" возле связанного доступа, есть множество примеров, когда вам нужен как доступ, так и какая точка выполнения.