Функции от algorithm
библиотека неправильно используется с несоответствующими входными параметрами, приводящими к неэффективному коду
Это средство проверки повышено, когда вы используете функции в algorithm
библиотека неэффективно или с несоответствующими входными параметрами. Вы можете повторно вычислять известную или постоянную информацию о контейнере, или вы можете использовать функцию, которая является несоответствующей для контейнера. Сценарии, которые инициировали это средство проверки, включают:
Используя поиск функционирует, такие как std::find
, std::equal_range
, std::upper_bound
, std::binary_search
и std::lower_bound
на ассоциативных контейнерах, таких как std::set
, std::map
, std::multiset
, и std::mutimap
.
Используя std::count
проверять, содержит ли контейнер определенный ключ. Таким образом, выход std::count
преобразован в bool
или по сравнению с любым 0
или 1
.
Используя std::is_sorted
на ассоциативном контейнере.
Используя std::distance
вычислить размер ассоциативного контейнера.
Используя std::adjacent_find
на контейнерах уникального значения, таких как std::set
или std::map
.
Неправильное использование функций от algorithm
библиотека или использование их с несоответствующими наборами входа могут привести к неэффективному коду или неожиданному поведению. Например:
Функционирует, такие как std::find
и std::binary_search
выполните линейный поиск, который неэффективен для ассоциативных контейнеров.
Функциональный std::count
выполняет линейный поиск, чтобы считать все соответствующие ключи в контейнере. При проверке, существует ли ключ в контейнере, выполняя исчерпывающий поиск каждого экземпляра ключа путем вызова std::count
является ненужным и неэффективным.
Выход std::is_sorted
является постоянным, когда обращено отсортированный контейнер. Выход неопределенен, когда функция вызвана на неотсортированном контейнере. Поскольку результат известен заранее, вызов является ненужным. Неопределенный выход может привести к неожиданному поведению.
Ассоциативные контейнеры имеют свой собственный size
метод, который более эффективен, чем использование std::distance
.
Выход std::adjacent_find
то, когда это используется на уникальном контейнере значения, является end()
. Компилятор производит тот же выход после исчерпывающего двоичного поиска. Поскольку выход известен заранее, вызов неэффективен.
Чтобы зафиксировать этот дефект, осуществите рефакторинг свой код, чтобы использовать стандартный algorithm
функции более эффективно. Определенная фиксация может зависеть от вашего варианта использования. Например:
При использовании ассоциативных контейнеров вызовите их методы члена, такие как std::set::find
, вместо std
функции, такие как std::find
.
Чтобы проверять включение, используйте член find
или contains
(C++ 20), функционирует вместо std::count
. Для контейнеров без этих функций членства используйте std::find
вместо std::count
.
Избегайте использования std::is_sorted
или std::adjacent_find
на ассоциативных контейнерах.
Чтобы проверять размер ассоциативного контейнера, используйте его член size
функция, такая как std::vector::size
. Избегайте использования std::distance
вычислить размер.
Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
Группа: Производительность |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
EXPENSIVE_USE_OF_STD_ALGORITHM |
Удар: Средняя |