namespace std {
template <class C>
auto begin(C& c) -> decltype(c.begin()); // (1) C++11
template <class C>
constexpr auto begin(C& c) -> decltype(c.begin()); // (1) C++17
template <class C>
auto begin(const C& c) -> decltype(c.begin()); // (2) C++11
template <class C>
constexpr auto begin(const C& c) -> decltype(c.begin()); // (2) C++17
template <class T, size_t N>
T* begin(T (&array)[N]); // (3) C++11
template <class T, size_t N>
constexpr T* begin(T (&array)[N]) noexcept; // (3) C++14
範囲から先頭要素へのイテレータを取得する。
この関数は、メンバ関数版のbegin()
とちがい、組み込み配列に対しても使用できる。
(1) : 非const
のコンテナの、先頭要素へのイテレータを取得する
(2) : const
のコンテナの、先頭要素へのイテレータを取得する
(3) : 組み込み配列の、先頭要素へのポインタを取得する
(1) : return c.begin();
(2) : return c.begin();
(3) : return array;
この関数は、範囲for
文の実装に使用される。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
void print(int x)
std::cout << x << " ";
int main()
// コンテナ
std::vector<int> v = {1, 2, 3};
decltype(v)::iterator first = std::begin(v);
decltype(v)::iterator last = std::end(v);
std::for_each(first, last, print);
std::cout << std::endl;
// 組み込み配列
int ar[] = {4, 5, 6};
int* first = std::begin(ar);
int* last = std::end(ar);
std::for_each(first, last, print);
1 2 3
4 5 6
バージョン
C++11
Clang: ??
GCC: 4.7.0
ICC: ??
Visual C++: ??
N2930 Range-Based For Loop Wording (Without Concepts)
boost::begin() - Boost Range Library
LWG2280 - begin/end for arrays should be constexpr and noexcept
P0031R0 A Proposal to Add Constexpr Modifiers to reverse_iterator
, move_iterator
, array
and Range Access