5

C ++ 11で使用可能な「foreach」スタイルの構文では、配列の実際のサイズ(要素の数)を知らなくても配列の反復が可能であるように思われます。これは新しい標準の一部であるため、Cアレイの場合でも完全に安全であると思います。通常、C配列を操作する前に、C配列のサイズも個別に知っておく必要がありますが、この新しいC ++手法の経験者から、期待どおりに機能することを確認してください。

extern float bunch[100];

for (float &f : bunch) {
  f += someNumber;
}

このテクニックの明らかでない副作用や不利な点について知っておくべきことはありますか?私が見るコードではあまり表示されません。おそらく、これが標準になる前にほとんどのコードが作成されたためです。よく知られていない他の理由が原因で、そのまれな使用法がないことを確認したい。

4

3 に答える 3

4

その使用法について、奇妙なことや危険なことは何もありません。配列のサイズはコンパイル時にわかっているため、ループで使用できます。これは、配列の長さを調べることができるテンプレート関数の例です。

template< class T, std::size_t N >
std::size_t length( const T (&)[N] )
{
  return N;
}

Foo f[5];
std::cout << length(f) << "\n";

これにより、動的にサイズ変更された C スタイルの配列では、この手法または範囲ベースのループを使用できないことが明確になります。

もちろん、範囲ベースのループがある場合はstd::array(そうでない場合は、おそらく ti から取得しstd::tr1たりブーストしたりできます)、C スタイルの配列を完全に避けることができます。

extern std::array<float, 100> bunch;

for (auto &f : bunch) {
  f += someNumber;
}
于 2013-01-21T13:41:11.420 に答える
4

範囲ベースの for ループを配列で使用することは完全に安全です。ポインターで誤って使用するのではないかと心配していると思います。

float* array = new float[100];
for (float& f : array) {
    // ...
}

心配しないでください。この場合、コンパイラはエラーを生成します。したがって、安全でない場合でも、とにかくコンパイル エラーが発生します。

于 2013-01-21T13:46:10.957 に答える
2

配列は参照として渡すことができ、その型と長さを推測できます。

#include <iostream>

template<typename T, size_t N>
void fun(T const (&arr)[N])
{
    for (std::size_t i = 0; i < N; ++i)
       std::cout << arr[i] << " ";
}

int main()
{
   int x[] = { 1, 2, 3 }; // no need to set length here
   fun(x); // 1 2 3, no need to specify type and length here
}
于 2013-01-21T13:37:52.603 に答える