Функции от 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 |
| Удар: Средняя |