名前空間
変種
操作

std::end, std::cend

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(C++11)(C++14)
(C++14)(C++14)  
endcend
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダー <array> で定義
ヘッダー <deque> で定義
ヘッダ <flat_map> で定義
ヘッダ <flat_set> で定義
ヘッダ <forward_list> で定義
ヘッダ <inplace_vector> で定義
ヘッダ <iterator> で定義
ヘッダ <list> で定義
ヘッダ <map> で定義
ヘッダ <regex> で定義
ヘッダー <set> で定義
ヘッダ <span> で定義
ヘッダ <string> で定義
ヘッダ <string_view> で定義
ヘッダ <unordered_map> で定義
ヘッダー <unordered_set> で定義
ヘッダー <vector> で定義
template< class C >
auto end( C& c ) -> decltype(c.end());
(1) (C++11以降)
(C++17 以降 constexpr)
template< class C >
auto end( const C& c ) -> decltype(c.end());
(2) (C++11以降)
(C++17 以降 constexpr)
template< class T, std::size_t N >
T* end( T (&array)[N] );
(3) (C++11以降)
(C++14以降 noexcept)
(C++14以降constexpr)
template< class C >

constexpr auto cend( const C& c ) noexcept(/* 以下参照 */)

    -> decltype(std::end(c));
(4) (C++14以降)

指定された範囲の末尾(つまり、最後の要素の次の要素)を指すイテレータを返します。

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

range-begin-end.svg

目次

[編集] パラメータ

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

[編集] 戻り値

1,2) c.end()
3) array + N
4) c.end()

[編集] 例外

4)
noexcept 指定:  
noexcept(noexcept(std::end(c)))

[編集] オーバーロード

適切な end() メンバ関数を公開していないが、イテレート可能なクラスや列挙型に対して、end のカスタムオーバーロードを提供できます。標準ライブラリによって既に提供されているオーバーロードは以下の通りです。

std::end を特殊化します。
(function template) [編集]
std::end を特殊化します。
(function template) [編集]
範囲ベース for ループのサポート
(function) [edit]
範囲ベース for ループのサポート
(関数) [編集]

swap の使用と同様に(Swappable で説明)、ジェネリックなコンテキストで end 関数を使用する一般的な方法は、using std::end; end(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);
 
    for (; it != end_it; ++it)
        f(*it);
}

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

(C++20以降)

[編集] 注記

配列以外のオーバーロードは、C::end() の動作を正確に反映します。メンバ関数が適切な実装を持っていない場合、その効果は驚くべきものになる可能性があります。

std::cend は、メンバおよび非メンバの範囲アクセスを統一するために導入されました。 LWG issue 2128 も参照してください。

C がシャロー const ビューである場合、std::cend はミュータブルイテレータを返す可能性があります。このような動作は一部のユーザーにとって予期しないものです。 P2276 および P2278 も参照してください。

[編集]

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v = {3, 1, 4};
    if (std::find(std::begin(v), std::end(v), 5) != std::end(v))
        std::cout << "Found a 5 in vector v!\n";
 
    int w[] = {5, 10, 15};
    if (std::find(std::begin(w), std::end(w), 5) != std::end(w))
        std::cout << "Found a 5 in array w!\n";
}

出力

Found a 5 in array w!

[編集] 関連項目

(C++11)(C++14)
コンテナまたは配列の先頭を指すイテレータを返す
(関数テンプレート) [編集]
rangeの終端を示す番兵を返す
(カスタマイゼーションポイントオブジェクト)[編集]
読み取り専用rangeの終端を示す番兵を返す
(カスタマイゼーションポイントオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)