Namespaces
Variants

std::begin, std::cbegin

ja.cppreference.net から
 
 
イテレータライブラリ
イテレータコンセプト
イテレータプリミティブ
アルゴリズムコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
範囲アクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダ <array>
で定義<deque>
ヘッダ <flat_map>
  (C++23以上) で定義
ヘッダ <flat_set>
  (C++23以上) で定義
ヘッダ <forward_list>
で定義<inplace_vector>
 ヘッダ
(C++26以上) で定義<iterator>
ヘッダ <list>
で定義<map>
ヘッダ <optional>
  (C++26以上) で定義
ヘッダ <regex>
で定義<set>
ヘッダ <span>
  (C++20以上) で定義
ヘッダ <stacktrace>
  (C++23以上) で定義
ヘッダ <string>
で定義<string_view>
 ヘッダ
(C++17以上) で定義<unordered_map>
ヘッダ <unordered_set>
で定義<valarray>
ヘッダ <vector>
template< class C > 
auto begin( C& c ) -> decltype(c.begin());
(1) (C++11以上)
(C++17以上でconstexpr)
template< class C > 
auto begin( const C& c ) -> decltype(c.begin());
(2) (C++11以上)
(C++17以上でconstexpr)
template< class T, std::size_t N > 
T* begin( T (&array)[N] );
(3) (C++11以上)
(C++14以上でnoexcept)
(C++14以上でconstexpr)
template< class C > 
constexpr auto cbegin( const C& c ) noexcept(/* see below */)
    -> decltype(std::begin(c));
(4) (C++14以上)

指定された範囲の先頭を指すイテレータを返します。

1,2) c.begin() を返します。これは通常、c が表すシーケンスの先頭を指すイテレータです。
1) C が標準 Container の場合、C::iterator オブジェクトを返します。
2) C が標準 Container の場合、C::const_iterator オブジェクトを返します。
3) array の先頭を指すポインタを返します。
4) std::begin(c) を返します。ただし c は常に const 修飾されているものとして扱われます。
C が標準 Container の場合、C::const_iterator オブジェクトを返します。

パラメータ

c - beginメンバ関数を持つコンテナまたはビュー
array - 任意の型の配列

戻り値

1,2) c. begin ( )
3) array
4) c. begin ( )

例外

4)
noexcept 指定子:
noexcept ( noexcept ( std :: begin ( c ) ) )

オーバーロード

適切な begin メンバ関数を公開していないが、反復処理が可能なクラスおよび列挙型に対して、 begin のカスタムオーバーロードを提供できます。標準ライブラリでは以下のオーバーロードが既に提供されています:

std::beginをオーバーロード std::begin
(関数テンプレート)
std::beginをオーバーロード std::begin
(関数テンプレート)
範囲ベースforループのサポート
(関数)
範囲ベースforループのサポート
(関数)

swapの使用( Swappable で説明)と同様に、ジェネリックな文脈におけるbegin関数の典型的な使用法は、 using std :: begin ; begin ( arg ) ; と等価であり、これによりユーザー定義型に対するADLで選択されたオーバーロードと標準ライブラリの関数テンプレートの両方が同一のオーバーロード集合に現れることが可能になります。

template<typename Container, typename Function>
void for_each(Container&& cont, Function f)
{
    using std::begin;
    auto it = begin(cont);
    using std::end;
    auto end_it = end(cont);
    while (it != end_it)
    {
        f(*it);
        ++it;
    }
}

実引数依存の名前探索 によって見つかった begin のオーバーロードは、 std::ranges::begin 、 std::ranges::cbegin および std::ranges::begin に依存する他のカスタマイゼーションポインタオブジェクトの動作をカスタマイズするために使用できます。

(C++20以降)

注記

非配列オーバーロードは C::begin の動作を正確に反映します。メンバー関数が合理的な実装を持たない場合、その効果は予想外のものとなる可能性があります。

std::cbegin は、メンバーおよび非メンバーの範囲アクセスの統一のために導入されました。関連項目: LWG issue 2128 。

Cがshallow-const viewである場合、 std::cbeginはmutable iteratorを返す可能性があります。この動作は一部のユーザーにとって予期せぬものです。関連資料: P2276 および P2278 も参照してください。

例

#include <iostream>
#include <iterator>
#include <vector>
int main() 
{
    std::vector<int> v = {3, 1, 4};
    auto vi = std::begin(v);
    std::cout << std::showpos << *vi << '\n'; 
    int a[] = {-5, 10, 15};
    auto ai = std::begin(a);
    std::cout << *ai << '\n';
}

出力:

+3
-5

関連項目

(C++11) (C++14)
コンテナまたは配列の終端を指すイテレータを返す
(関数テンプレート)
範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)