Проверка наличия элемента в массиве в C++
Как мне проверить, есть ли в массиве элемент, который я ищу?
В Java я бы сделал что-то вроде этого:
Foo someObject = new Foo(someParameter);
Foo foo;
// Ищем в массиве Foo[] arr
for(int i = 0; i < arr.length; i++){
if (arr[i].equals(someObject))
foo = arr[i];
}
if (foo == null)
System.out.println("Не найдено!");
else
System.out.println("Найдено!");
Но в C++ я не уверен, что могу искать, если объект равен null. Как можно решить эту задачу в C++?
4 ответ(ов)
В C++ для поиска элемента в массиве можно использовать std::find
, а затем проверить, указывает ли полученный указатель на конец диапазона. Например:
Foo array[10];
... // Инициализация массива здесь
Foo *foo = std::find(std::begin(array), std::end(array), someObject);
// Если элемент не найден, std::find вернёт конец диапазона
if (foo != std::end(array)) {
cerr << "Найден на позиции " << std::distance(array, foo) << endl;
} else {
cerr << "Не найден" << endl;
}
В этом коде, если искомый элемент (someObject
) присутствует в массиве array
, мы получим его адрес, и сможем вычислить его позицию с помощью std::distance
. Если элемент отсутствует, std::find
вернёт указатель на конец массива, и мы выведем сообщение о том, что элемент не найден.
Вы можете сделать то же самое, перебирая массив в поисках нужного значения. Конечно, если массив отсортирован, это значительно ускорит процесс поиска. Пример кода может выглядеть примерно так:
for(int i = 0; i < arraySize; i++){
if(array[i] == itemToFind){
break;
}
}
Этот код проходит по элементам массива и прекращает выполнение, как только находит искомый элемент.
Вот простой универсальный шаблон функции contains
на C++11, который работает как для массивов, так и для контейнеров:
using namespace std;
template<class C, typename T>
bool contains(C&& c, T e) { return find(begin(c), end(c), e) != end(c); };
Простое использование contains(arr, el)
во многом похоже на семантику оператора in
в Python.
Вот полный пример:
#include <algorithm>
#include <array>
#include <string>
#include <vector>
#include <iostream>
template<typename C, typename T>
bool contains(C&& c, T e) {
return std::find(std::begin(c), std::end(c), e) != std::end(c);
};
template<typename C, typename T>
void check(C&& c, T e) {
std::cout << e << (contains(c,e) ? "" : " not") << " found\n";
}
int main() {
int a[] = { 10, 15, 20 };
std::array<int, 3> b { 10, 10, 10 };
std::vector<int> v { 10, 20, 30 };
std::string s { "Hello, Stack Overflow" };
check(a, 10);
check(b, 15);
check(v, 20);
check(s, 'Z');
return 0;
}
Вывод:
10 found
15 not found
20 found
Z not found
Функция contains
использует алгоритм std::find
, чтобы проверить наличие элемента в переданном контейнере или массиве. Это решение удобно, так как позволяет использовать один и тот же код для разных типов данных.
Есть несколько способов решить эту задачу. Один из них — использовать алгоритм std::find()
. Вот пример кода:
#include <algorithm>
int myArray[] = { 3, 2, 1, 0, 1, 2, 3 };
size_t myArraySize = sizeof(myArray) / sizeof(int);
int *end = myArray + myArraySize;
// находим значение 0:
int *result = std::find(myArray, end, 0);
if (result != end) {
// значение найдено по указателю "result"...
}
В этом примере мы создаем массив и вычисляем его размер. Затем мы используем std::find
для поиска элемента со значением 0. Если элемент найден, указатель result
будет отличен от end
, и вы можете работать с найденным значением.
Как удалить элемент из std::vector<> по индексу?
`unsigned int` против `size_t`: когда и что использовать?
Какова разница между "new", "malloc" и "calloc" в C++?
Что означает && в конце сигнатуры функции (после закрывающей скобки)?
Инициализация std::string из char* без копирования