какова альтернатива?
Я должен записать один?
Существует алгоритм std :: find ()
, который выполняет линейный поиск по диапазону итераторов, например,
std::vector<int> v;
// Finds the first element in the vector that has the value 42:
// If there is no such value, it == v.end()
std::vector<int>::const_iterator it = std::find(v.begin(), v.end(), 42);
Если ваш вектор отсортирован, вы можете используйте std :: binary_search ()
, чтобы проверить, присутствует ли значение в векторе, и std :: equal_range ()
, чтобы получить итераторы начала и конца для диапазона элементов в вектор, имеющий это значение.
Причина отсутствия vector::find
в том, что нет алгоритмического преимущества над std::find
(std::find
- O(N)
и в общем случае для векторов нельзя сделать лучше).
Но причина, по которой у вас есть map::find
, в том, что он может быть более эффективным (map::find
- O(log N)
, так что вы всегда захотите использовать его вместо std::find
для карт).
Используйте std :: find (vec.begin (), vec.end (), value)
.
И не забудьте включить <алгоритм>
Кто вам это сказал? В C ++ есть алгоритм "поиска" для вектора
. По иронии судьбы По совпадению, он называется std :: find
. Или, может быть, std :: binary_search
. Или что-то еще, в зависимости от свойств данных, хранящихся в вашем векторе.
Контейнеры получают свои собственные конкретные версии универсальных алгоритмов (реализованных как контейнерные методы) только тогда, когда эффективная реализация алгоритма так или иначе связана с внутренними деталями контейнера. std :: list <> :: sort
- один из примеров.
Во всех остальных случаях алгоритмы реализуются автономными функциями.
какая альтернатива?
Стандарт предлагает std :: find для последовательного поиска по произвольным последовательностям похожих элементов (или что-то вроде что).
Это можно применить ко всем контейнерам, поддерживающим итераторы, но для контейнеров с внутренней сортировкой (например, std :: map
) поиск можно оптимизировать. В этом случае контейнер предлагает собственную функцию-член find
.
почему в C ++ нет функции поиска вектора?
Не было смысла создавать std :: vector ??> :: find
, поскольку реализация была бы идентична ] std :: find (vector.begin (), vector.end (), value_to_find);
.
Должен ли я писать самому?
Нет. Если у вас нет особых ограничений или требований, по возможности следует использовать реализацию STL.