почему нет никаких, находят для вектора в C++

какова альтернатива?

Я должен записать один?

7
задан James McNellis 19 September 2010 в 04:49
поделиться

5 ответов

Существует алгоритм 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 () , чтобы получить итераторы начала и конца для диапазона элементов в вектор, имеющий это значение.

44
ответ дан 6 December 2019 в 04:44
поделиться

Причина отсутствия vector::find в том, что нет алгоритмического преимущества над std::find (std::find - O(N) и в общем случае для векторов нельзя сделать лучше).

Но причина, по которой у вас есть map::find, в том, что он может быть более эффективным (map::find - O(log N), так что вы всегда захотите использовать его вместо std::find для карт).

21
ответ дан 6 December 2019 в 04:44
поделиться

Используйте std :: find (vec.begin (), vec.end (), value) .

И не забудьте включить <алгоритм>

4
ответ дан 6 December 2019 в 04:44
поделиться

Кто вам это сказал? В C ++ есть алгоритм "поиска" для вектора . По иронии судьбы По совпадению, он называется std :: find . Или, может быть, std :: binary_search . Или что-то еще, в зависимости от свойств данных, хранящихся в вашем векторе.

Контейнеры получают свои собственные конкретные версии универсальных алгоритмов (реализованных как контейнерные методы) только тогда, когда эффективная реализация алгоритма так или иначе связана с внутренними деталями контейнера. std :: list <> :: sort - один из примеров.

Во всех остальных случаях алгоритмы реализуются автономными функциями.

8
ответ дан 6 December 2019 в 04:44
поделиться

какая альтернатива?

Стандарт предлагает std :: find для последовательного поиска по произвольным последовательностям похожих элементов (или что-то вроде что).

Это можно применить ко всем контейнерам, поддерживающим итераторы, но для контейнеров с внутренней сортировкой (например, std :: map ) поиск можно оптимизировать. В этом случае контейнер предлагает собственную функцию-член find .

почему в C ++ нет функции поиска вектора?

Не было смысла создавать std :: vector :: find , поскольку реализация была бы идентична ] std :: find (vector.begin (), vector.end (), value_to_find); .

Должен ли я писать самому?

Нет. Если у вас нет особых ограничений или требований, по возможности следует использовать реализацию STL.

2
ответ дан 6 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: