# std::size, std::ssize

< cpp‎ | iterator

定义于头文件 `<array>` |  |
定义于头文件 `<deque>` |  |
定义于头文件 `<forward_list>` |  |
定义于头文件 `<iterator>` |  |
定义于头文件 `<list>` |  |
定义于头文件 `<map>` |  |
定义于头文件 `<regex>` |  |
定义于头文件 `<set>` |  |
定义于头文件 `<span>` |  | (C++20 起)
定义于头文件 `<string>` |  |
定义于头文件 `<string_view>` |  |
定义于头文件 `<unordered_map>` |  |
定义于头文件 `<unordered_set>` |  |
定义于头文件 `<vector>` |  |
template <class C> constexpr auto size(const C& c) -> decltype(c.size()); | (1) | (C++17 起)
template <class C> constexpr auto ssize(const C& c) -> std::common_type_t<std::ptrdiff_t, std::make_signed_t<decltype(c.size())>>; | (2) | (C++20 起)
template <class T, std::size_t N> constexpr std::size_t size(const T (&array)[N]) noexcept; | (3) | (C++17 起)
template <class T, std::ptrdiff_t N> constexpr std::ptrdiff_t ssize(const T (&array)[N]) noexcept; | (4) | (C++20 起)

返回给定范围的大小。

1-2) 返回 `c.size()` ，若需要则转换到返回类型。
3-4) 返回 `N` 。

### 参数

c | - | 拥有 `size` 成员函数的容器或视图
array | - | 任意类型的数组

### 返回值

`c` 或 `array` 的大小。

### 异常

1-2) 可能抛出实现定义的异常。

### 重载

可以为不暴露适合的 `size()` 成员函数的类或枚举提供 `size` 的自定义重载，从而能检测它。

实参依赖查找所找到的 `size` 重载能用于定制 std::ranges::size、 std::ranges::ssize 及 std::ranges::empty 的行为。 | (C++20 起)

### 可能的实现

版本一
    template <class C>
    constexpr auto size(const C& c) -> decltype(c.size())
    {
        return c.size();
    }
版本二
    template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>> {
        using R = std::common_type_t<std::ptrdiff_t,
                                     std::make_signed_t<decltype(c.size())>>;
        return static_cast<R>(c.size());
    }
版本三
    template <class T, std::size_t N>
    constexpr std::size_t size(const T (&array)[N]) noexcept
    {
        return N;
    }
版本四
    template <class T, std::ptrdiff_t N>
    constexpr std::ptrdiff_t ssize(const T (&array)[N]) noexcept
    {
        return N;
    }

### 示例

    #include <iostream>
    #include <vector>
    #include <iterator>

    int main()
    {
        std::vector<int> v = { 3, 1, 4 };
        std::cout << std::size(v) << '\n';

        int a[] = { -5, 10, 15 };
        std::cout << std::size(a) << '\n';
    }

输出：

    3
    3

### 参阅

ptrdiff_t | 在两个指针相减时返回的有符号整数类型 (typedef)
size_t | `sizeof` 运算符返回的无符号整数类型 (typedef)
ranges::size (C++20) | 返回等于范围大小的整数 (定制点对象)
ranges::ssize (C++20) | 返回等于范围大小的有符号整数 (定制点对象)