Obiekty funkcji w standardowej bibliotece C++

Obiekt funkcji lub functor to dowolny typ implementujący operator(). Ten operator jest określany jako operator wywołania lub czasami operator aplikacji. Standardowa biblioteka języka C++ używa obiektów funkcji głównie jako kryteriów sortowania kontenerów i algorytmów.

Obiekty funkcji zapewniają dwie główne zalety wywołania funkcji prostej. Pierwszy polega na tym, że obiekt funkcji może zawierać stan. Drugim jest to, że obiekt funkcji jest typem i dlatego może być używany jako parametr szablonu.

Tworzenie obiektu funkcji

Aby utworzyć obiekt funkcji, utwórz typ i zaimplementuj operator(), na przykład:

class Functor
{
public:
    int operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    Functor f;
    int a = 5;
    int b = 7;
    int ans = f(a, b);
}

Ostatni wiersz main funkcji pokazuje sposób wywoływania obiektu funkcji. To wywołanie wygląda jak wywołanie funkcji, ale faktycznie wywołuje operator() typu Functor. Podobieństwo między wywoływaniem obiektu funkcji a funkcją polega na tym, jak pojawił się obiekt funkcji terminu.

Obiekty funkcji i kontenery

Standardowa biblioteka języka C++ zawiera kilka obiektów funkcji w pliku nagłówka <functional> . Jednym z tych obiektów funkcji jest kryterium sortowania dla kontenerów. Na przykład set kontener jest zadeklarowany w następujący sposób:

template <class Key,
    class Traits=less<Key>,
    class Allocator=allocator<Key>>
class set

Drugim argumentem szablonu jest obiekt lessfunkcji . Ten obiekt funkcji zwraca true wartość, jeśli pierwszy parametr jest mniejszy niż drugi parametr. Ponieważ niektóre kontenery sortują swoje elementy, kontener potrzebuje sposobu porównywania dwóch elementów. Porównanie odbywa się przy użyciu obiektu funkcji. Możesz zdefiniować własne kryteria sortowania dla kontenerów, tworząc obiekt funkcji i określając go na liście szablonów dla kontenera.

Obiekty i algorytmy funkcji

Innym zastosowaniem obiektów funkcjonalnych jest algorytmy. Na przykład remove_if algorytm jest zadeklarowany w następujący sposób:

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    Predicate pred);

Ostatnim argumentem remove_if jest obiekt funkcji, który zwraca wartość logiczną ( predykat). Jeśli wynikiem obiektu funkcji jest true, element zostanie usunięty z kontenera, do których uzyskuje dostęp iteratory first i last. Możesz użyć dowolnych obiektów funkcji zadeklarowanych w nagłówku <functional> argumentu pred lub utworzyć własne.

Zobacz też

Dokumentacja standardowej biblioteki C++