最終更新日時(UTC): 2026年01月31日 04時25分25秒
Akira Takahashi が更新

履歴 編集

function template
<iterator>

# std::size(C++17)

    namespace std {
      template <class C>
      constexpr auto
        size(const C& c)
          -> decltype(c.size());            // (1) C++17
      template <class C>
      constexpr auto
        size(const C& c)
          noexcept(noexcept(c.size()))
          -> decltype(c.size());            // (1) C++26

      template <class T, std::size_t N>
      constexpr std::size_t
        size(const T (&array)[N]) noexcept; // (2) C++17
    }

## 概要

コンテナの要素数を取得する。

## 戻り値

- (1) : `return c.size();`
- (2) : `return N;`

## 備考

- 機能テストマクロは`__cpp_lib_nonmember_container_access`で値は`201411`
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる：
  - `<array>`
  - `<deque>`
  - `<forward_list>`
  - `<list>`
  - `<map>`
  - `<regex>`
  - `<set>`
  - `<string>`
  - `<string_view>` (C++20)
  - `<unordered_map>`
  - `<unordered_set>`
  - `<vector>`

## 例

    #include <vector>
    #include <iostream>

    int main()
    {
      int arr[4] = {};
      std::cout << std::size(arr) << std::endl;

      std::cout << std::size(u8"arikitari") << std::endl;

      std::vector<int> v = { 1,1,2,3,5,8 };
      int hoge = 13;
      v.push_back(hoge);
      std::cout << std::size(v) << std::endl;

      //変数vの型はstd名前空間にあるクラス型なので
      //ADLによって `std::`がなくとも発見できる
      std::cout << size(v) << std::endl;
    }

### 出力

    4
    10
    7
    7

## 詳細

これまで`_countof`や`numof`, `arraySizeOf`, `ARRAY_SIZE`, `ARRAY_LENGTH`等の名前で配列の要素数を求めるために、概ね次のようなマクロが利用されてきた。

    #define COUNTOF(array) (sizeof(array) / sizeof(array[0]))

`std::size()`はこれを置き換えるものである。

## バージョン

### 言語

- C++17

### 処理系

- Clang: 3.6 ✅
- GCC: 6.1 ✅
- ICC: ??
- Visual C++: 2015 ✅

## 関連項目

- `std::ranges::size`

## 参照

- `boost::size()` - Boost Range Library
- N4280: Non-member `size()` and more (Revision 2)
- LWG Issue 3009. Including `<string_view>` doesn't provide `std::size/empty/data`
- P3016R6 Resolve inconsistencies in `begin`/`end` for `valarray` and `braced-initializer-list`