При последовательном обходе обычно быстрее vector: элементы лежат рядом, что помогает кешу и предвыборке. У list требуется переход по указателям между отдельными узлами.
Что будет быстрее при последовательной итерации по одинаковым элементам: std::list или std::vector, и почему?
При последовательном обходе обычно быстрее vector: элементы лежат рядом, что помогает кешу и предвыборке. У list требуется переход по указателям между отдельными узлами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
При последовательном обходе обычно быстрее vector: элементы лежат рядом, что помогает кешу и предвыборке. У list требуется переход по указателям между отдельными узлами.
Для обоих контейнеров полный обход имеет сложность O(n), но стоимость доступа к памяти различается. Узлы list дополнительно хранят связи и могут быть разбросаны по памяти; процессор хуже скрывает задержки зависимых чтений.
Результат зависит от размера элементов, аллокатора и работы внутри цикла, поэтому для критичного кода нужен замер. Преимущества list связаны с другими операциями и стабильностью ссылок, а не с простым обходом. Асимптотическая одинаковость не означает одинаковой фактической скорости.