0

Проверка наличия элемента в массиве в C++

29

Как мне проверить, есть ли в массиве элемент, который я ищу?

В 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 ответ(ов)

1

В 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 вернёт указатель на конец массива, и мы выведем сообщение о том, что элемент не найден.

0

Вы можете сделать то же самое, перебирая массив в поисках нужного значения. Конечно, если массив отсортирован, это значительно ускорит процесс поиска. Пример кода может выглядеть примерно так:

for(int i = 0; i < arraySize; i++){
    if(array[i] == itemToFind){
        break;
    }
}

Этот код проходит по элементам массива и прекращает выполнение, как только находит искомый элемент.

0

Вот простой универсальный шаблон функции 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, чтобы проверить наличие элемента в переданном контейнере или массиве. Это решение удобно, так как позволяет использовать один и тот же код для разных типов данных.

0

Есть несколько способов решить эту задачу. Один из них — использовать алгоритм 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, и вы можете работать с найденным значением.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь