Namespaces
Variants

std::end, std::cend

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 end( C& c ) -> decltype(c.end());
で定義 (1) (C++11以降)
(constexpr、C++17以降)
template< class C >
auto end( const C& c ) -> decltype(c.end());
(2) (C++11以降)
(constexpr、C++17以降)
template< class T, std::size_t N >
T* end( T (&array)[N] );
(3) (C++11以降)
(noexcept、C++14以降)
(constexpr、C++14以降)
template< class C >
constexpr auto cend( const C& c ) noexcept(/* see below */)
    -> decltype(std::end(c));
(4) (C++14以降)

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

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

パラメータ

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

戻り値

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

例外

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

オーバーロード

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

std::endを特殊化 std::end
(関数テンプレート)
std::endを特殊化 std::end
(関数テンプレート)
範囲ベースforループのサポート
(関数)
範囲ベース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::end 、 std::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)
コンテナまたは配列の先頭を指すイテレータを返す
(関数テンプレート)
範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト)
読み取り専用範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト)