1. ホーム
  2. c++

[解決済み] コンテナ固有のバージョンではなく、std::beginとstd::endを使用する場合 [duplicate]

2022-11-16 21:04:46

質問

コンテナ固有の begin と end を自由関数の代わりに使用する場合の一般的な設定やルールはありますか? std::beginstd::end ?

私の理解では、関数がテンプレートで、コンテナ型がテンプレートのパラメータである場合、次のようになります。 std::begin そして std::end を使うべきであり、すなわち

template<class T> void do_stuff( const T& t )
{
    std::for_each( std::begin(t), std::end(t), /* some stuff */ );
}

コンテナの型がわかっている標準関数やメンバー関数のような他のシナリオではどうでしょうか?やはり std::begin(cont)std::end(cont) あるいは、コンテナのメンバ関数 cont.begin()cont.end() が優先されるのでしょうか?

を呼び出すことによるパフォーマンスの利点はないと考えてよいのでしょうか? cont.end() の上に std::end(cont) ?

どのように解決するのですか?

の定義を見てみると、例えば std::begin :

template< class C > 
auto begin( C& c ) -> decltype(c.begin());

を参照するだけであることがわかります。 begin() を参照しているだけです。 まともなコンパイラならその差はゼロになると思うので、結局は好みの問題なんでしょうけど。 個人的には cont.begin()cont.end() にしておけば、誰にも説明する必要がありませんから :)

しかし、Mooing Duckが指摘するように std::begin は配列上でも動作します。

template< class T, size_t N > 
T* begin( T (&array)[N] );

...というわけで、考慮すべき点があります。 もし、あなたが ではなく を使用していない場合は、私の提案に従います。 しかし、渡されたものがSTLコンテナなのか、それとも配列の <T> の配列なのかがわからない場合は std::begin() がいいんじゃないでしょうか。