Как проверить содержит ли вектор элемент?
Помощь в написании контрольных, курсовых и дипломных работ здесь.

Постройте вектор, каждый элемент которого содержит наименьший по абсолютной величине элемент.

Нужно что-то подобное (пример на c++): vector v; //Вектор v содержит структуры.
Вот написал для вектора int’ов, но не работает
Да, уже понял что ошибся 
А про скорость ничего не скажете, что лучше для поиска по вектору int’ов?
Я вот сейчас замерил скорость find, а в search походу если одно число искать, а не диапазон, то мне надо задать его дважды, т.к. там можно задать только диапазон, правильно я мыслю? Или search предназначен только для поиска диапазона, и для поиска определенного числа его использовать неправильно?
Добавлено через 20 минут
Попробовал задать начальное и конечное значение одним числом, не вышло. Оказалось что разница между binary_search и search больше чем возможность поиска по несортированному вектору. binary_search ищет определенное число (у меня получилось его запустить), в то время как search диапазон, который нельзя задать одним числом, или у меня просто не получилось
Помощь в написании контрольных, курсовых и дипломных работ здесь.

Сформировать вектор B=(b1,b2,…bm), каждый элемент которого определяется как минимальный элемент.
Поиск элемента в std :: vector
Я хочу проверить, существует ли элемент в векторе или нет, чтобы я мог разобраться с каждым случаем.
Я наткнулся на эту формулу:
Я не понимаю, зачем нам нужен vector.end () в конце, не достаточно ли найти (vector.begin (), vector.end (), item), чтобы найти элемент?
Решение
вернет Итератор, поэтому, сравнивая его с
вы на самом деле проверяете, существует ли такой итератор с этим элементом.
Другие решения
Я не понимаю, зачем нам нужен vector.end () в конце, не так ли?
найти (vector.begin (), vector.end (), item) достаточно, чтобы найти элемент?
Результат find при невозможности найти совпадение — итератор, указывающий на конец предоставленного диапазона, и нет ничего особенно особенного в конечных итераторах, которые позволяют сравнивать их, как логическое состояние.
find был разработан, чтобы быть алгоритмом общего назначения, который работает с широким спектром контейнеров (включая даже те, которые потенциально находятся вне стандартной библиотеки). Он также предназначен просто для того, чтобы возвращать, был ли найден элемент или нет — он возвращает итератор, указывающий на элемент, если он найден. В результате, он не возвращает ноль или что-то в этом роде, если не может найти элемент. Возвращает итераторы.
Если вы действительно много делаете такого рода вещи (и я рекомендую делать что-то подобное, если вы делаете это, поскольку вы вводите что-то постороннее в ежедневный код), вы можете сделать что-то вроде этого:
Как узнать, присутствует ли элемент в std :: vector?
Все, что я хочу сделать, это проверить, существует ли элемент в векторе или нет, чтобы я мог разобраться в каждом случае.
17 ответов
Вы можете использовать std::find из :
Используйте find из заголовка алгоритма stl. Я проиллюстрировал его использование с типом int. Вы можете использовать любой тип, который вам нравится, если вы можете сравнивать на равенство (перегрузите ==, если вам нужно для вашего пользовательского класса).
Если ваш вектор не упорядочен, используйте подход, предложенный MSN:
Если ваш вектор упорядочен, используйте метод binary_search, предложенный Брайаном Нилом:
Бинарный поиск дает производительность O (log n) в худшем случае, что намного эффективнее, чем первый подход. Чтобы использовать двоичный поиск, вы можете использовать qsort, чтобы сначала отсортировать вектор, чтобы гарантировать, что он упорядочен.
. таким образом, он действительно четкий и читаемый. (Очевидно, вы можете повторно использовать шаблон в нескольких местах).
В качестве альтернативы используйте лямбду:
Вот функция, которая будет работать для любого контейнера:
Имейте в виду, что если вы собираетесь выполнять много поисков, есть контейнеры STL, которые лучше подходят для этого. Я не знаю, что это за приложение, но, возможно, стоит подумать об ассоциативных контейнерах, таких как std :: map.
Используйте функцию STL find.
Имейте в виду, что существует также функция find_if, которую можно использовать, если вы поиск более сложен, т.е. если вы не просто ищете элемент, но, например, хотите увидеть, есть ли элемент, удовлетворяющий определенному условию, например, строка, начинающаяся с «abc». ( find_if даст вам итератор, указывающий на первый такой элемент).
С Boost вы можете использовать any_of_equal :
Вы можете попробовать этот код:
Вы также можете разыменовать этот итератор и использовать его как обычно, как и любой другой итератор.
Вы тоже можете использовать счетчик. Он вернет количество элементов, присутствующих в векторе.
Как узнать, присутствует ли элемент в std::vector?
Все, что я хочу сделать, это проверить, существует ли элемент в векторе или нет, поэтому я могу иметь дело с каждым случаем.
ОТВЕТЫ
Ответ 1
Вы можете использовать std::find из :
Это возвращает bool ( true если присутствует, false противном случае). С вашим примером:
Ответ 2
Ответ 3
Используйте find из заголовка алгоритма stl.I показало его использование с типом int. Вы можете использовать любой тип, который вам нравится, пока вы можете сравнить для равенства (перегрузка ==, если вам нужно для своего пользовательского класса).
Ответ 4
Если ваш вектор не упорядочен, используйте подход, предложенный MSN:
Если ваш вектор упорядочен, используйте метод binary_search Брайан Нил предложил:
двоичный поиск дает O (log n) наихудшую производительность, что намного эффективнее первого подхода. Чтобы использовать двоичный поиск, вы можете использовать qsort для сортировки вектора сначала, чтобы гарантировать его упорядочение.
Ответ 5
Я использую что-то вроде этого.
. таким образом он на самом деле понятен и читабель. (Очевидно, вы можете повторно использовать шаблон в нескольких местах).
Ответ 6
Вот функция, которая будет работать для любого контейнера:
Обратите внимание, что вы можете обойтись без 1 параметра шаблона, потому что вы можете извлечь value_type из Контейнера. Вам нужно typename потому что Container::value_type является зависимым именем.
Ответ 7
Имейте в виду, что если вы собираетесь делать много поисков, есть контейнеры STL, которые лучше для этого. Я не знаю, что ваше приложение, но ассоциативные контейнеры, такие как std:: map, заслуживают рассмотрения.
Ответ 8
Ответ 9
Используйте функцию STL find.
Имейте в виду, что существует функция find_if, которую вы можете использовать, если ваш поиск более сложный, не просто поиск элемента, но, например, хотите увидеть, есть ли элемент, который выполняет определенное условие, например строку, начинающуюся с «abc». ( find_if даст вам итератор, который указывает на первый такой элемент).
Ответ 10
С boost вы можете использовать any_of_equal :
Ответ 11
Вы можете попробовать этот код:
Ответ 12
Вы также можете разыменовать этот итератор и использовать его как обычно, как и любой другой итератор.
Ответ 13
Вы также можете использовать счетчик. Он вернет количество элементов, присутствующих в векторе.
Ответ 14
Если вы хотите найти строку в векторе:
Ответ 15
Другой пример с использованием операторов С++.
Ответ 16
Ответ 17
можно использовать std::search также
Это также полезно для поиска последовательности элементов.
Также есть гибкость прохождения некоторых поисковых алгоритмов. Обратитесь сюда.
Ответ 18
Используя Newton C++, это проще, самодокументировано и быстрее, чем с std :: find, потому что возвращает bool напрямую.
Как проверить, находится ли элемент в векторе из структур?
Я создал эту структуру:
Я хочу создать функцию, которая возвращает истину, если векторные объекты уже содержат тему. Вот что я сделал (но это неправильно):
Что я должен изменить, чтобы это работало?
Цель программы — создать виртуальную библиотеку, в которую я могу добавить столько книг, сколько захочу. Чтобы создать книгу, я должен добавить имя автора, название и набор тем. Таким образом, для каждой книги может быть более одной темы. Я должен использовать три структуры данных (topic_set, book, library), и я не могу изменить это.
Решение
Версия без петель будет использовать станд :: find_if :
Кроме того, вы должны действительно пройти topic_set по константной ссылке, а не по значению:
Другие решения
Прежде всего, ваш код даже не компилируется. topics.i должно привести к ошибке компиляции, так как topic_set не имеет члена i (как требуется в for петля).
Правильный синтаксис для такого поведения будет что-то вроде этого
Я удалил topics это в таком случае. Его использование не правильно в вашем случае.
Я изменил твою функцию. Он перебирает темы темы по одной и сравнивает каждую с темой, заданной в качестве параметра. Когда равенство найдено, оно возвращает истину, иначе ложь.
Я не пойду дальше, так как полагаю, что вы новичок. Но вы должны знать, что есть еще путь, если вы хотите написать правильный C ++ код.
Другие ответы показывают некоторые из продвинутых концепций, хотя я думаю, что, может быть, сейчас слишком рано для вас.
Я также не могу точно сказать, что вы пытаетесь сделать с library структура и Library вектор
С учетом изменения topic_set на string ваша новая исправленная функция будет выглядеть следующим образом:
Кроме того, вы хотите иметь возможность иметь повторяющиеся записи в векторе предметов? Вам нужен постоянный доступ к определенным показателям? Если нет, то вы можете захотеть std::set для этого, который сделал бы ваш contains выглядеть следующим образом:
Может быть чище сделать что-то вроде следующего:


