как узнать есть ли элемент в векторе c

Как проверить содержит ли вектор элемент?

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

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

Как создать вектор, который содержит классы?
Нужно что-то подобное (пример на c++): vector v; //Вектор v содержит структуры.

Вот написал для вектора int’ов, но не работает

Да, уже понял что ошибся
А про скорость ничего не скажете, что лучше для поиска по вектору int’ов?
Я вот сейчас замерил скорость find, а в search походу если одно число искать, а не диапазон, то мне надо задать его дважды, т.к. там можно задать только диапазон, правильно я мыслю? Или search предназначен только для поиска диапазона, и для поиска определенного числа его использовать неправильно?

Добавлено через 20 минут
Попробовал задать начальное и конечное значение одним числом, не вышло. Оказалось что разница между binary_search и search больше чем возможность поиска по несортированному вектору. binary_search ищет определенное число (у меня получилось его запустить), в то время как search диапазон, который нельзя задать одним числом, или у меня просто не получилось

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

Сформировать вектор B=(b1,b2,…bm), каждый элемент которого определяется как минимальный элемент соответствующего столбца исходной матрицы A(n,m)
Сформировать вектор 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 выглядеть следующим образом:

Может быть чище сделать что-то вроде следующего:

Источник

Советы мастера