0

簡単な例として、次のコードを見てください (または、テンプレートやその他の一般的なコーディング手法ではなく、配列固有のコードを想像してください)。

int a[] = {1,2,3,7,8,9,55};
vector<int> v(a, end(a));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

ここで、またはおそらく別の設定で使用するコーディング上の理由があるかどうか疑問に思っていましたstd::begin(スタイル/一貫性/将来のコード変更との互換性など以外)。実際に必要な場所はありますか?

begin(a)コーディングの実践に関して、そこを使用することについてどう思いますか? 無意識に を呼び出すと、C++ での配列とポインターの基本的な操作を知らないように見えるリスクがあるため、私にとっては扱いにくいトピックですstd::begin。現実的には、コンテナーを変更する機能は必要ないかもしれません。つまり、さあ。実際にコンテナを変更すると、コンパイラのバグが発生し、3 秒で修正されます。

「時期尚早の最適化」について聞いたことがあるでしょう。std::beginここでの使用を「時期尚早の一般性」と呼びます。

4

3 に答える 3

4

練習として、beginこのコンテキストで を使用しても、それが持つと思われるマイナス面は実際には保持されません。それどころか、それを使用しないことは一貫性がなく、C++ がどのように機能するかの側面を理解していることを誇示するための無意味な複雑さのように思えます。次の人がこのコードを見て、なぜあなたが使用しなかったのかを理解するために二度見することにbeginなりend、時間を無駄にします。

より具体的には、ここを使用すると、コードを壊さずbeginに の型を変更できます。a

于 2013-11-05T18:38:45.580 に答える
1

テンプレートを作成する場合にのみ使用してください。通常のコードでは、その通りです。必要ありません。

コンテナーで動作するテンプレートを作成する場合、それが通常の配列なのかベクトルなのか、それとも何か他のものなのかわかりません。したがって、 usingx.begin()は配列では機能せず、配列で機能するものは STL コンテナーでは機能しません。したがって、begin を使用してギャップを埋め、違いを無視して、テンプレートが配列と STL コンテナーの両方で機能するようにします。

于 2013-11-05T18:45:23.847 に答える
1

コーディングの実践に関して、begin(a) を使用することについてどう思いますか?

これを使って。

begin配列のインデックス付けではなく使用について話していると仮定すると(例: arry[0])、コンテナを変更して結果のコンパイラ エラーを修正するのは簡単だというあなたの推測は非現実的です。

あちこちに散らばる数十の異なるモジュールの 1,000,000 行のコードで構成されるコードベースを想像してみてください。このコレクションにどこからでもアクセスしようとしている可能性があります。すべてのコンパイラ エラーを修正するには、数時間または数日かかる場合があります。この例は不自然ではありません。私が取り組んでいるコードベースは数百万行のコードで、その一部は何年も前に忘れていました。

于 2013-11-05T18:40:51.317 に答える