How to implement the find_if_not algorithm to find the first element not satisfying a predicate in C

1 Answer

0 votes
#include <stdio.h>
#include <stdbool.h>

/*
    find_if_not:
    Returns a pointer to the first element in the array that does NOT satisfy
    the given predicate.

    Parameters:
        arr       - pointer to the array
        n         - number of elements in the array
        predicate - function pointer returning true for elements that satisfy
                    the condition

    Returns:
        Pointer to the first element for which predicate(element) == false.
        If all elements satisfy the predicate, returns NULL.

    This is the idiomatic C equivalent of C++'s std::find_if_not.
*/
int* find_if_not(const int *arr, size_t n, bool (*predicate)(int)) {
    for (size_t i = 0; i < n; i++) {
        if (!predicate(arr[i])) {
            /* Cast away const so caller can modify if desired */
            return (int*)&arr[i];
        }
    }
    return NULL;
}

/* Predicate: returns true if number is positive */
bool is_positive(int x) {
    return x > 0;
}

/* Predicate: returns true if number is even */
bool is_even(int x) {
    return (x % 2) == 0;
}

int main(void) {
    int data[] = {2, 4, 7, 6, -1, 8, 10, -3};
    size_t n = sizeof(data) / sizeof(data[0]);

    /* First test: find first element NOT positive */
    int *p1 = find_if_not(data, n, is_positive);

    if (p1) {
        printf("First element NOT positive: %d\n", *p1);
    } else {
        printf("All elements are positive\n");
    }

    /* Second test: find first element NOT even */
    int *p2 = find_if_not(data, n, is_even);

    if (p2) {
        printf("First element NOT even: %d\n", *p2);
    } else {
        printf("All elements are even\n");
    }

    return 0;
}


/*
run:

First element NOT positive: -1
First element NOT even: 7

*/

 



answered Jul 26 by avibootz

Related questions

...