-1

私は次の配列を持っています:

int* myArray = new int[45];

配列の実際のサイズを知らずに各要素を繰り返したい場合は、for_each?を使用する必要があります。

もしそうなら、あなたはどのように書くでしょうfor_eachか?私は次のサイトを調べてfor_eachを読んでいましたが、これをまとめる方法がわかりません。

http://www.cplusplus.com/reference/algorithm/for_each/


更新:for_eachこの場合、配列のサイズを知る必要があるため、Aは適切な選択ではありません。ベクトルは、そのようなタスクを実行するための適切な方法です。この場合、配列を使用する理由は、学習目的でした。これが深刻なプロジェクトである場合は、リスト/ベクトルなどに移動します。

4

4 に答える 4

4

質問が最初に投稿されたとき、問題の配列は次のように宣言されていたことに注意してください

int myArray[45];

この答えはその特定のケースを扱っています。

C ++ 11をサポートしている場合は、範囲ベースのループを使用できます。

for (int& i : myArray) {
  std::cout << i << "\n";
}

C ++ 11は、std::beginstd::endも提供します。これらは、固定サイズの配列で使用して、イテレーターを取得できます。

std::for_each(std::begin(myArray), std::end(myArray), <func>);

C ++ 03で機能し、固定サイズの配列を処理している別のオプションは、関数テンプレートを定義することです。

// taken a fixed size array by reference and loop over it
template <typename T, unsigned int N>
void array_for_each( T (&a)[N]) {

  for (unsigned int i = 0; i < N; ++i) {
    // do something with array elements
    std::cout << a[i] << " ";
  }

}

int main() {
  int a[5];
  array_for_each(a);
}
于 2012-08-09T07:00:21.263 に答える
2

MSVCを使用する場合は、「foreach」を使用できます。

for each(int i in arr) {
    cout << i << ' ';
}

注:これは、配列が宣言されているコードのブロックでのみ機能します。

そうでない場合は、C++11標準の新しい範囲ベースのforループを使用することもできます。

for(int i : arr) {
    cout << i << ' ';
}

std :: for_eachに興味がある場合:

for_each(arr,arr + 10,[] (int i) {
        cout << i << ' ';
});

注:これには、アレイのサイズ(この例では10)の知識が必要です。

于 2012-08-09T07:27:59.953 に答える
1

配列を反復するために使用できる場合でも、for_eachが設計されているクラスではなく、intの配列について説明しましたInputIteratorが、配列を反復するには配列のサイズを知る必要があります。

for_eachを使用する場合は、、を使用するかvectorlist含まれる要素の数を追跡するクラスを実装する必要があります。IMOを使用する方がはるかに簡単ですvector

現在の配列を0で終了すると仮定して、現在の配列を繰り返し処理する場合は、次のようにします。

for(int *value = myArray; *value != 0; ++value)
  printf("%d\n", *value);

または、インデックスを使用できます。

for(int index = 0; myArray[index] != 0; ++index)
  printf("%d\n", myArray[index]);

IMOポインタメソッドはよりクリーンです。

ただし、このコードは依然として危険です。個別の変数内のレコード数を追跡するか、ベクトルを使用する必要があります。

于 2012-08-09T06:59:30.483 に答える
1

を使用できますfor_each。この場合、配列内の45個の要素にスペースを割り当てていますが、NULLであるため、何かをしようとするとセグメンテーション違反が発生する可能性があります。配列の値を保持するか、sizeof(myArray)/sizeof(myArray[0])(独自の問題がある)のようなものを使用する必要があります。

とにかく、for_eachここでは、実際に45個の要素がある場合:

 std::for_each(myArray, myArray + 45, <func>);

とにかく、これはベクトルを使用する理由の一部です。.begin()そして、.end()誤ったインデックスを使用することによるエラーを減らします。

于 2012-08-09T07:06:55.227 に答える