Я смущен о выполнении моего кода, протестированного на std::vector
и std::list
. Есть ли разница между этими двумя, когда дело доходит до find_if
и max_element
?std :: vector и std :: list find_if и max_element performance
ответ
В терминах обозначения большой О, обе имеют одинаковые характеристики O (n). (find_if
может быть меньше, если элемент обнаружен раньше, но это одинаково верно для обоих контейнеров.)
С точки зрения фактического времени настенных часов вектор будет работать лучше из-за когерентности кеша; все векторные элементы являются последовательными в памяти, поэтому доступ к ним будет лучше использовать кэш ЦП. Элементы связанного списка могут быть разбросаны по всей памяти, и вам также необходимо следить за ссылками на список, которые требуют времени.
Оба алгоритма - O (n) с точки зрения вычислительной сложности, но векторы выделяют свои элементы в смежной области хранения, что, скорее всего, приведет к более высокой скорости попадания в кеш. С другой стороны, перемещение списков связано с шаблоном доступа к разбросанной памяти, что, скорее всего, приводит к более высокой скорости промахов в кэше.
Как всегда, когда дело доходит до производительности, делайте измерения перед принятием решений.
Для max_element пройдут все элементы как списка, так и массива. Таким образом, оба являются O (n) с точки зрения производительности.
Опять же для find_if обход будет линейным (O (n)) для обеих структур данных.
Я не думаю, что разница между константами по отношению к каждой из них не должна быть большой.
- 1. Выбор между std :: list и std :: vector
- 2. std :: vector и std :: list memory layout
- 3. std :: list, std :: vector methods and malloc()
- 4. Кэш-дружественность std :: list vs std :: vector
- 5. std :: list vs std :: vector iteration
- 6. Указатели на элементы std :: vector и std :: list
- 7. Структура данных контейнера, аналогичная std :: vector и std :: list
- 8. Относительная производительность std :: vector vs. std :: list vs. std :: slist?
- 9. Перекресток между std :: multimap и std :: vector?
- 10. std :: for_each и std :: vector destructor call
- 11. Проблемы с std :: piecewise_constant_distribution и std :: vector
- 12. std :: vector :: emplace_back и std :: move
- 13. C++ std :: vector performance [reference required]
- 14. C++ Std queue and vector performance
- 15. std :: vector as key в std :: set и std :: unordered_set
- 16. std :: vector of std :: weak_ptr и std :: find
- 17. Как написать функцию, принимающую std :: vector или std :: list?
- 18. Pass std :: max_element() или std :: min_element() для функции argiment
- 19. std :: find_if, std :: binary_function для поиска std :: map по значению
- 20. Что произошло, когда std :: vector = std :: vector?
- 21. Как использовать std :: max_element на двумерном векторе
- 22. std :: vector и Move constructor
- 23. C++ - Итерация по std :: vector <> вернулась из find_if
- 24. Свободная память, занимаемая Std List, Vector, Map и т. Д.
- 25. std :: max_element на сложных элементах (operator = issue)
- 26. Почему C++ std :: max_element так медленно?
- 27. unique_ptr push_back и std :: list
- 28. std :: max_element для второго по величине элемента?
- 29. Сравнение элементов std :: vector C++
- 30. Ошибка компиляции в std :: find_if
[Bjarne Stroustrup: C++ 11 Style] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-Style) - от слайда 43. – Naszta