5

最新の C++ 11 仕様では、「範囲ベースの for ループ」と呼ばれる新しいタイプの for ループが定義されています。その外観とメカニズムは、他の言語で使用できる for-each ループとほとんど同じように見えます。

もしあれば、それらの2つの違いは何ですか? 違いがない場合、なぜ新しい名前になったのですか?

編集:明確にするために、C++ の「範囲ベースの for」と他の言語の for each または std::for_each との間の実装の違いを探しているわけではありません。代わりに、彼らがこの新しい C++ の「機能」(または構文、イディオムなど、呼びたいもの) を「for each」ではなく「範囲ベースの for ループ」と呼ぶことにしたという事実の背後に、何らかの隠された価値があるのではないかと考えていました。ループ」というのは、他のほとんどの人がこれらのことを呼んでいるように見えるからです。

4

3 に答える 3

14

構文:

for ( range_declaration : range_expression) loop_statement  

以下と同等のコードを生成します。

{
    auto && __range = range_expression ; 
    auto __begin = begin_expr(__range); 
    auto __end = end_expr(__range); 
    for (;__begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
} 

std::for_each単項関数を指定された範囲に適用します。したがって、次の 2 つの基本的な違いがあります。

  • begin()範囲ベースの for ループ構文はより簡潔でより普遍的ですが、 from to以外の指定された範囲に対してループ内でコードを実行することはできませんend()
  • begin()および関数を定義することにより、イテレータが定義されていないコンテナに範囲ベースの for ループを適用できますend()

標準イディオムがないため、「一般化された for-each イディオム」と比較することはできません。比較するには、具体的な実装を指摘する必要があり、違いは通常、詳細に隠されています

于 2012-04-17T11:16:44.700 に答える
6

もしあれば、それらの2つの違いは何ですか? 違いがない場合、なぜ新しい名前になったのですか?

実際、それは古い名前です: for.

foreach他の言語が行ったように、C++ が などの新しい名前を言語に追加しない理由を意味している場合は、古い名前が正常に機能するのに新しい名前を追加する理由を教えてください。


あなたのコメントから:

しかし、私の知る限り、他のすべての人はこのタイプの構文を「for-each ループ」と呼んでいます。コンセプトの新しい名前は、実際に私が見ることができる以上の違いがあるかどうかを尋ねました.

大丈夫。それは用語についてです: for-each-looprange-based-for-loop

C++ range-based-for-loop は、基本的にstd::begin(c)std::end(c)で定義された範囲内のすべての要素を反復するためだと思います。つまり、range-based-for-loopという名前は、 rangeを定義するとイテレータの哲学を強調しています。beginend

さらに説明すると、range-based-for-loop は、begin()end()が定義されているコレクションに対してのみ機能します。

std::vector<int> v;
int a[100];
int *p = new int[100];

for(int i : v) {} // works :  begin(v) and end(v) are defined
for(int i : a) {} // works :  begin(a) and end(a) are defined
for(int i : p) {} // does not work :  begin(p) and end(p) are not defined

それが役立つことを願っています。

于 2012-04-17T11:19:35.067 に答える
-3

これは標準の foreach 実装であり、便宜上追加されたシンタックス シュガーのみです。

于 2012-04-17T11:20:24.590 に答える