2013-06-22 6 views
2

Есть ли какое-либо преимущество при использовании C++ 11's std::find над методом контейнера find?Достоинства std :: find

  • В случае std::vector (который не имеет метод find) делает std::find использование некоторых смарт-алгоритм или наивный способ просто итерация каждый элемент?

  • В случае std::map кажется вам нужно пройти вдоль std::pair, который является value_type из std::map. Это не кажется очень полезным, как обычно вы хотите найти либо для ключа, либо для сопоставленного элемента.

  • Как насчет других контейнеров, таких как std::list или std::set или std::unordered_set?

+1

Вы можете использовать 'std :: find_if' на' std :: map', чтобы сравнить только ключ. Но лучше использовать функцию 'find' member в этом случае из-за производительности. Однако, если по какой-то причине вы хотели найти карту по значению, вы можете использовать 'find_if' в этом случае. –

+3

используйте функцию-член, если она существует, и используйте 'std :: find', если это не так. –

+0

Если вы знаете, что ваш std :: vector действительно отсортирован, всегда существует возможность использования std :: lower_bound() для выполнения двоичного поиска. – Adam

ответ

8

В случае станд :: вектор (который не имеет метод поиска) имеет 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), соответственно).

Смежные вопросы