1. ホーム
  2. c++

[解決済み】C++11で非メンバーのbeginとend関数を使うのはなぜ?

2022-04-08 12:02:44

質問

すべての標準コンテナには beginend メソッドで、そのコンテナのイテレータを返します。しかし、C++11 では、どうやら std::begin std::end を呼び出すものです。 beginend メンバ関数を使用します。そのため、以下のように記述する代わりに

auto i = v.begin();
auto e = v.end();

と書くと

auto i = std::begin(v);
auto e = std::end(v);

講演の中で モダンC++の書き方 Herb Sutterは、コンテナの開始または終了イテレータが必要なときは、今は常にfree関数を使うべきだと言っています。しかし、彼は、以下の点については詳しくは述べない。 なぜ ということです。コードを見ると、1文字分しか節約できていない。つまり、標準コンテナに関しては、フリーファンクションは全く意味がないようだ。Herb Sutter氏は、非標準のコンテナにも利点があることを示したが、やはり詳細には触れなかった。

そこで問題なのは、フリー関数版の std::beginstd::end は、対応するメンバ関数を呼び出す以上のことをするのでしょうか、また、なぜそれを使いたいのでしょうか?

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

をどのように呼び出すのですか? .begin().end() を C 配列に配置するのですか?

自由関数は、変更できないデータ構造に対して後から追加できるため、より汎用的なプログラミングが可能です。