- iterator[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp17[meta cpp]
namespace std {
template <class C>
constexpr auto size(const C& c) -> decltype(c.size()); // (1)
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept; // (2)
}
コンテナの要素数を取得する。
- (1) :
return c.size();
- (2) :
return N;
- 機能テストマクロは
__cpp_lib_nonmember_container_access
で値は201411
<iterator>
ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
#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;
}
- std::size[color ff0000]
- size[color ff0000]
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 [mark verified]
- GCC: 6.1 [mark verified]
- ICC: ??
- Visual C++: 2015 [mark verified]