Как проверить наличие элемента в векторе c
На этом шаге мы рассмотрим особенности обращения к элементам вектора .
В таблице 1 перечислены все операции прямого обращения к элементам векторов. Как принято в С и C++ , первому элементу вектора соответствует индекс 0, а последнему — индекс size()-1 . Таким образом, n -му элементу соответствует индекс n -1. Для неконстантных векторов эти операции возвращают ссылку на элемент и поэтому могут использоваться для модификации элементов (при условии, что модификация не запрещена по другим причинам).
| Операция | Описание |
|---|---|
| c.at(idx) | Возвращает элемент с индексом idx (при недопустимом значении индекса генерируется исключение out_of_range ) |
| c[idx] | Возвращает элемент с индексом idx (без интервальной проверки!) |
| c.front() | Возвращает первый элемент (без проверки его существования!) |
| c.back() | Возвращает последний элемент (без проверки его существования!) |
Самый важный аспект для вызывающей стороны — наличие или отсутствие интервальной проверки при обращении к элементу. Такая проверка выполняется только функцией at() . Если индекс не входит в интервал допустимых значений, генерируется исключение out_of_range (смотри 47 шаг). Остальные функции выполняются без проверки , и интервальные ошибки приводят к непредсказуемым последствиям. Вызов оператора [], функций front() и back() для пустого контейнера всегда приводит к непредсказуемым последствиям.
std::vector coll; // Пустой вектор! coll[5] = elem; // ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ std::cout // ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ
Следовательно, перед вызовом оператора [] необходимо убедиться в том, что индекс имеет допустимое значение, а перед вызовом функции front() или back() — что контейнер не пуст:
std::vector coll; // Пустой вектор! if (coll.size() > 5) < coll[5] = elem; // OK > if (!coll.empty()) < cout // OK > coll.at(5) = elem; // Генерирует исключение out_of_range
На следующем шаге мы рассмотрим функции получения итераторов .
Поиск элемента в векторе
Нужна функция поиска элемента в векторе. Т.е., например, есть вектор с повторяющимися числами, если есть такое число в векторе, нужно вернуть истину. Может, в стандартной библиотеке есть готовое решение.
Отслеживать
31k 13 13 золотых знаков 96 96 серебряных знаков 157 157 бронзовых знаков
задан 22 окт 2014 в 6:51
10k 14 14 золотых знаков 53 53 серебряных знака 118 118 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вы не поверите, но такая функция есть! И она даже называется загадочно — find :).
Читать детальнее с примерами.
Отслеживать
ответ дан 22 окт 2014 в 7:11
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
перед чтения примеров хочу спросить. она возращает указатель на позицию вхождения или мусор. мне 0 или 1 надо
22 окт 2014 в 7:17
А вот вначале нужно почитать! Там написано, что если что то нашло — возвратит указатель (итератор) на найденное. Если нет — последний элемент (в случае с вектором это обычно myvector.end() . Но может быть Вам нужен std::cout.
22 окт 2014 в 7:23
Спасибо. Лучше я сам переберу. Но все равно спасибо. Учту ее на будующее, вдруг последний элемент искомое.
22 окт 2014 в 7:33
последний элемент не может быть «искомым». Потому что то, что в качестве параметра задается как последний элемент, это «за последним элементом» на самом деле. Поэтому все будет работать правильно. Ещё раз другими словами. vector.end() указывает на самый конец вектора, за последним элементом вектора. Разыминовать его нельзя. Можно почитать ещё на SO с картинками. А вот писать ручками — это дело такое. Можно легко натворить ошибок даже в током простом коде.
Как проверить наличие элемента в векторе c
Вырезка из Help BCB
Summary
Finds an occurrence of value in a sequence.
Synopsis
#include
template
InputIterator find(InputIterator first,
InputIterator last,
const T& value); // третий аргумент
Description
The find algorithm lets you search for the first occurrence of a particular value in a sequence. find returns the first iterator i in the range [first, last) for which the following condition holds:
If find does not find a match for value, it returns the iterator last.
Type T must be EqualityComparable.
Complexity
find performs at most last-first comparisons.
// // find.cpp // #include #include #include #include using namespace std; int main() < typedef vectorint>::iterator iterator; int d1[10] = ; // Set up a vector vectorint> v1(d1,d1 + 10); // Try find iterator it1 = find(v1.begin(),v1.end(),3); // it1 = v1.begin() + 4; // Try find_if iterator it2 = find_if(v1.begin(),v1.end(),bind1st(equal_toint>(),3)); // it2 = v1.begin() + 4 // Try both adjacent_find variants iterator it3 = adjacent_find(v1.begin(),v1.end()); // it3 = v1.begin() +2 iterator it4 = adjacent_find(v1.begin(),v1.end(),equal_toint>()); // v4 = v1.begin() + 2 // Output results cout " " " " " " return 0; >
Хочешь быть счастливым — будь им!
Без булдырабыз.
Re[2]: vector, find
| От: | Vamp |
| Дата: | 22.10.03 07:39 |
| Оценка: |
Не знаю, как автор оригинального вопроса, а я, например, Вашего ответа не понял.
В меру сил отвечу сам — да, правильно. Так все и должно быть.
Найти что-то в векторе в C++?


Программирование и разработка
На чтение 9 мин Просмотров 15.4к. Опубликовано 15.09.2021
Вектор C ++ не имеет функции-члена поиска. Однако в библиотеке алгоритмов есть функции find () разных типов, которые можно использовать для поиска чего-либо в векторе C ++. В библиотеке алгоритмов есть четыре группы функций find (), которые можно классифицировать как «Найти», «Найти конец», «Найти сначала» и «Найти по соседству».
Чтобы использовать библиотеки векторов и алгоритмов, программа на C ++ должна начинаться с:
#include
#include
#include
using namespace std ;
В этом руководстве приведены основы поиска значения в векторе C ++. Весь код в этом руководстве находится в функции main (), если не указано иное. Если вектор состоит из строк, используйте строковый класс; и не используйте «const char *». В этом случае также должен быть включен строковый класс, например:
Find
InputIterator find (сначала InputIterator, последним InputIterator, const T & value);
Следующий код использует эту функцию, чтобы узнать, входит ли цветок «Василек» в векторный список цветов:
Flower found at index: 5
Целый список вектора был целью поиска. Судя по синтаксису функции find (), «first» — это vtr.begin () в коде, а «last» — это vtr.end () в коде. Значение, которое нужно искать в синтаксисе функции find (), обозначенное как const-T & -value, в коде имеет значение «Василек».
Функция find () просматривает список векторов с самого начала. Если он не видит искомого значения, он достигнет конца вектора. Конец вектора — это официально vtr.end (), который находится сразу за последним элементом. Если он не видит искомого значения, он вернет итератор, указывающий на vtr.end ().
Значение, которое он ищет, может находиться в разных местах одного и того же вектора. Когда он видит первое из искомых значений, он останавливается на нем и возвращает итератор, указывающий на это значение.
Каждое значение в векторе имеет индекс. Первое значение имеет индекс 0, соответствующий vtr.begin (). Второе значение имеет индекс 1, соответствующий vtr.begin () + 1. Третье значение имеет индекс 2, соответствующий vtr.begin () + 2. Четвертое значение имеет индекс 3, соответствующий vtr.begin () + 3. ; и так далее. Итак, индекс первого найденного значения определяется как:
it — vtr.begin()
Чувствительность к регистру
Поиск в векторе чувствителен к регистру. Если бы значение, которое нужно было найти, было «CORNFLOWER» для указанной выше программы, оно не было бы найдено и была бы возвращена vtr.end ().
Range Within Limits
Диапазон не обязательно должен составлять весь вектор. Для приведенной выше программы диапазон мог быть от индекса 1 до индекса 4. То есть от «vtr.begin () + 1» до «vtr.end () — 4». «Vtr.end () — 4» получается вычитанием из обратного с учетом того, что vtr.end () находится сразу за самым последним элементом.
Когда весь список векторов является диапазоном, проверка того, является ли итератор возврата vtr.end (), показывает, было ли значение найдено или нет. Если итератором возврата является vtr.end (), это означает, что значение не было найдено. Теперь, когда диапазон меньше, если итератор возврата является последним элементом выбранного диапазона, это означает, что значение либо не было найдено, либо это последнее значение диапазона.
Примечание. Поиск останавливается на последнем элементе выбранного (меньшего) диапазона, если значение не было найдено в этом диапазоне или если найденное значение является последним элементом выбранного диапазона. Если найденное значение было этим последним элементом, будет возвращен итератор, указывающий на него. Если значение было найдено раньше, поиск остановится на этом элементе перед последним элементом выбранного диапазона. Итератор этого элемента будет возвращен.
Следующий код иллюстрирует эту схему:
Flower was not found in range !
Теперь «Василек» имеет индекс 5, а «Kingcup» — индекс 4. Последний элемент в небольшом диапазоне, выбранном для поиска, — «Kingcup». Итак, соответствующее условие теста — «it — vtr.begin () == 4». Обратите внимание, что выражения «vtr.end () — 4» и «it — vtr.begin () == 4», каждое из которых имеет 4, являются просто совпадением.
Чтобы «Василек» был в малом диапазоне поиска, соответствующее условие проверки должно быть «it — vtr.begin () == 5». Следующий код иллюстрирует это:
Flower found at index : 5
More Than One Occurrence
В следующей программе «Василек» встречается более чем в одном месте. Чтобы найти все индексы вхождений, используйте цикл while для продолжения поиска после предыдущего вхождения до конца (vtr.end ()) вектора. Программа:
Flower found at index : 1
Flower found at index : 5
Flower found at index : 7
Finding Integer
Вектор может состоять из целых чисел. Первое целочисленное значение можно найти с помощью функции find () (из библиотеки алгоритмов). Следующая программа иллюстрирует это:
Number found at index : 2
for the first occurrence of the value , 3 .
Predicate
InputIterator find_if (сначала InputIterator, затем — InputIterator, предикат предиката);
Здесь используется функция find_if (), а не просто find (). Pred — это имя функции, которая дает критерии поиска. Этот третий аргумент принимает только имя функции, без аргументов и без скобок. Если функция-предикат принимает аргумент, тогда в определении функции указываются параметры для аргументов. Следующая программа иллюстрирует это, ища первое четное число в списке векторов:
#include
#include
#include
using namespace std ;
bool fn ( int n ) <
if ( ( n % 2 ) == 0 )
return true ;
else
return false ;
>int main ( )
<
vectorvtr = < 1 , 3 , 5 , 7 , 8 , 9 , 10 , 11 , 12 >;vector :: iterator it = find_if ( vtr. begin ( ) , vtr. end ( ) , fn ) ;
if ( it == vtr. end ( ) )
cout else
coutreturn 0 ;
>
Number found at index : 4
Обратите внимание, что был выполнен поиск по всему вектору с диапазоном «vtr.begin (), vtr.end ()».
Имя функции-предиката здесь — fn. Требуется один аргумент — целое число. Когда функция find_if () начинает сканирование вектора с первого элемента, она вызывает функцию предиката с каждым числом в векторе в качестве аргумента. Сканирование останавливается, когда он достигает первого элемента в векторе, для которого предикат возвращает истину.
Заключение
Функция find () в библиотеке алгоритмов существует в четырех категориях: «Найти», «Найти конец», «Найти сначала» и «Найти по соседству». Только категория «Найти» была объяснена выше, и в значительной степени. Приведенное выше объяснение является основой для всех функций find () в библиотеке алгоритмов. Функции Find () имеют дело с итераторами напрямую и косвенно с индексами. Программист должен знать, как преобразовать итератор в индексную и общую арифметику итератора, как показано выше.