В случае станд :: вектор (который не имеет метод поиска) имеет STD :: найти использовать некоторые умный алгоритм или наивный способ просто итерация каждого элемента?
Не может быть, потому что векторы не отсортированы. Другого способа найти элемент в несортированном векторе нет, кроме линейного поиска с сложностью O (n).
С другой стороны, контейнеры последовательностей не имеют функций-членов find()
, поэтому вы не сможете их использовать.
В случае std :: map кажется, что вам нужно пройти по std :: pair, которая является value_type для std :: map. Это не кажется очень полезным, как обычно вы хотите найти либо для ключа, либо для сопоставленного элемента.
Действительно, здесь вы должны использовать функцию-член find()
, что гарантирует лучшую сложность (O (log N)).
В общем случае, когда контейнер предоставляет функцию-член с тем же именем, что и общий алгоритм, это связано с тем, что функция-член выполняет то же самое, но обеспечивает лучшую гарантию сложности.
Как насчет других контейнеров, таких как std :: list или std :: set или std :: unordered_set?
Так же, как std::vector
, std::list
не отсортированный контейнер - так относится к тому же выводу.
Для std::set
и std::unordered_set
, вместо этого, вы должны использовать функцию find()
члена, что гарантирует лучшую сложность (O (журнал N) и среднее O (1), соответственно).
Вы можете использовать 'std :: find_if' на' std :: map', чтобы сравнить только ключ. Но лучше использовать функцию 'find' member в этом случае из-за производительности. Однако, если по какой-то причине вы хотели найти карту по значению, вы можете использовать 'find_if' в этом случае. –
используйте функцию-член, если она существует, и используйте 'std :: find', если это не так. –
Если вы знаете, что ваш std :: vector действительно отсортирован, всегда существует возможность использования std :: lower_bound() для выполнения двоичного поиска. – Adam