# std::empty

From cppreference.com
< cpp‎ | iterator

Defined in header `<iterator>` |  |
| (1) |
template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); |  | (since C++17) (until C++20)
template <class C> [[nodiscard]] constexpr auto empty(const C& c) -> decltype(c.empty()); |  | (since C++20)
| (2) |
template <class T, std::size_t N> constexpr bool empty(const T (&array)[N]) noexcept; |  | (since C++17) (until C++20)
template <class T, std::size_t N> [[nodiscard]] constexpr bool empty(const T (&array)[N]) noexcept; |  | (since C++20)
| (3) |
template <class E> constexpr bool empty(std::initializer_list<E> il) noexcept; |  | (since C++17) (until C++20)
template <class E> [[nodiscard]] constexpr bool empty(std::initializer_list<E> il) noexcept; |  | (since C++20)

Returns whether the given container is empty.

1) returns c.empty()
2) returns false
3) returns il.size() == 0

### Parameters

c | - | a container with an `empty` method
array | - | an array of arbitrary type
il | - | an initializer list

### Return value

true if the container doesn't have any element.

### Notes

In addition to being included in `<iterator>`, `std::empty` is guaranteed to become available if any of the following headers are included: `<array>`, `<deque>`, `<forward_list>`, `<list>`, `<map>`, `<regex>`, `<set>`, `<span>` (since C++20), `<string>`, `<string_view>`, `<unordered_map>`, `<unordered_set>`, and `<vector>`.

### Possible implementation

First version

    template <class C>
    constexpr auto empty(const C& c) -> decltype(c.empty())
    {
        return c.empty();
    }

Second version

    template <class T, std::size_t N>
    constexpr bool empty(const T (&array)[N]) noexcept
    {
        return false;
    }

Third version

    template <class E>
    constexpr bool empty(std::initializer_list<E> il) noexcept
    {
        return il.size() == 0;
    }

### Example

Run this code

    #include <iostream>
    #include <vector>

    template <class T>
    void print(const T& container)
    {
        if ( !std::empty(container) )
        {
             std::cout << "Elements:\n";
             for ( const auto& element : container )
                 std::cout << element << '\n';
        }
        else
        {
            std::cout << "Empty\n";
        }
    }

    int main()
    {
        std::vector<int> c = { 1, 2, 3 };
        print(c);
        c.clear();
        print(c);

        int array[] = { 4, 5, 6 };
        print(array);

        auto il = { 7, 8, 9 };
        print(il);
    }

Output:

    Elements:
    1
    2
    3
    Empty
    Elements:
    4
    5
    6
    Elements:
    7
    8
    9

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/empty&oldid=105243"