Udostępnij za pośrednictwem


Obiekty funkcji w standardowej bibliotece C++

Obiekt funkcji lub functor to dowolny typ, który implementuje operator()element . 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 w stosunku do zwykłego wywołania funkcji. 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()element , na przykład:

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

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(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() typ LessThanFunctor . 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 Compare = std::less<Key>,
    class Allocator = std::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 funkcji jest algorytmy. Na przykład remove_if algorytm jest zadeklarowany w następujący sposób:

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

Ostatnim argumentem remove_if jest obiekt funkcji, który zwraca wartość logiczną ( predykat). Jeśli wynikiem obiektu funkcji jest true, element jest przesunięty tak, że znajduje się poza nowym końcem zwracanym przez remove_ifelement . 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++